17143 낚시왕 - 삼성 sw 역량 기출
R x C 격자판에 상어가 있다. (1,1) ~ (R,C)
상어는 크기와 속도를 가지고 있다.
낚시꾼은 0행에서 오른쪽으로 이동하고 가장 오른쪽 열에서 멈춘다.
낚시 절차
- 낚시왕이 오른쪽으로 한 칸 이동한다.
 - 낚시왕이 있는 열에 있는 상어 중 가장 가까운 상어를 잡는다. 잡은 상어는 사라진다.
 - 상어가 이동한다.
 
상어는 주어진 속도로 칸을 이동한다.
경계에 다다른 경우에는 방향을 반대로 바꿔서 이동한다.
풀이
- 
    
상어를 객체를 만든다. (r, c, s, d, z)
 - 
    
초기 map과 초기 list에 모든 상어의 상태를 저장해준다.
 - 
    
상어 이동 메소드를 구현한다. -
moveShark- 
        
파라미터로 상어 객체와 그 객체의 속도를 받는다.
 - 
        
속도가 0이 될 때까지 재귀
 - 
        
각 방향에 while 반복을 하면서 속도가 0이 되거나 위치가 경계면에 다다르면 break해준다.
 
 - 
        
 - 
    
for문으로 낚시꾼을 열 방향으로 이동시킨다.
- 
        
for문으로 행이동하며 map이 null이 아니면 상어의 크기를 저장하고 상어를 제거한 뒤 break해준다.
 - 
        
arraylist를 초기화하고 현재 map의 상어들을 다시 저장한다. -
list - 
        
새로운 arraylist를 생성하여 moveShark메소드의 결과 상어들을 저장한다. -
moveList - 
        
moveList의 상어들을 초기화 한 map에 저장한다- 이미 상어가 있으면 크기 비교를 한 뒤 큰 것을 저장한다.
 
 - 
        
map에 남은 상어들을 다시
list에 저장해 준다. 
 - 
        
 - 
    
누적된 상어의 크기를 출력한다.
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main낚시왕 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st1 = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st1.nextToken());
		C = Integer.parseInt(st1.nextToken());
		int M = Integer.parseInt(st1.nextToken());
		List<Shark> list = new ArrayList<Shark>();
		Shark[][] map = new Shark[R+1][C+1];
		for(int i = 0; i < M; i++) {
			StringTokenizer st2 = new StringTokenizer(br.readLine());
			int r = Integer.parseInt(st2.nextToken());
			int c = Integer.parseInt(st2.nextToken());
			int s = Integer.parseInt(st2.nextToken());
			int d = Integer.parseInt(st2.nextToken());
			int z = Integer.parseInt(st2.nextToken());
			Shark shark = new Shark(r, c, s, d, z);
			list.add(shark);
			map[r][c] = shark;
		}
		int sum = 0;
		for(int j = 1; j <= C; j++) {
			//상어 잡기
			for(int i = 1; i <= R; i++) {
				if(map[i][j]!=null) {
					sum += map[i][j].z;
					map[i][j] = null;
					break;
				}
			}
			list = new ArrayList<Shark>();
			for(int k = 1; k <= R; k++ ) {
				for(int l = 1; l <= C; l++) {
					if(map[k][l] != null) {
						list.add(map[k][l]);
					}
				}
			}
			//상어 이동
			moveList = new ArrayList<Shark>();
			for(int k = 0; k < list.size(); k++) {
				Shark shark = list.get(k);
				moveShark(shark, shark.s);
			}
			map= new Shark[R+1][C+1];
			for(int k = 0; k < moveList.size(); k++) {
				Shark shark = moveList.get(k);
				if(map[shark.r][shark.c] == null) {
					map[shark.r][shark.c] = shark;
				}else {
					if(map[shark.r][shark.c].z <= shark.z) {
						map[shark.r][shark.c] = shark;
					}
				}
			}
			list = new ArrayList<Shark>();
			for(int k = 1; k <= R; k++ ) {
				for(int l = 1; l <= C; l++) {
					if(map[k][l] != null) {
						list.add(map[k][l]);
					}
				}
			}
		}
		System.out.println(sum);
	}
	static int R;
	static int C;
	static List<Shark> moveList;
	static void moveShark(Shark shark, int speed) {
		if(speed <= 0) {
			moveList.add(shark);
			return;
		}
		if(shark.d == 1) {
			while(true) {
				if(speed <= 0)break;
				if(shark.r == 1) {
					shark.d = 2;
					break;
				}
				shark.r--;
				speed--;
			}
		}else if(shark.d == 2) {
			while(true) {
				if(speed <= 0)break;
				if(shark.r == R) {
					shark.d = 1;
					break;
				}
				shark.r++;
				speed--;
			}
		}else if(shark.d == 3) {
			while(true) {
				if(speed <= 0)break;
				if(shark.c == C) {
					shark.d = 4;
					break;
				}
				shark.c++;
				speed--;
			}
		}else if(shark.d == 4) {
			while(true) {
				if(speed <= 0)break;
				if(shark.c == 1) {
					shark.d = 3;
					break;
				}
				shark.c--;
				speed--;
			}
		}
		moveShark(shark, speed);
	}
}
class Shark{
	int r;	//y
	int c;	//x
	int s;	//speed
	int d;	//dir
	int z;	//size
	public Shark() {}
	public Shark(int r, int c, int s, int d, int z) {
		super();
		this.r = r;
		this.c = c;
		this.s = s;
		this.d = d;
		this.z = z;
	}
}