17143 낚시왕 - 삼성 sw 역량 기출

낚시왕

R x C 격자판에 상어가 있다. (1,1) ~ (R,C)

상어는 크기와 속도를 가지고 있다.

낚시꾼은 0행에서 오른쪽으로 이동하고 가장 오른쪽 열에서 멈춘다.

낚시 절차

  1. 낚시왕이 오른쪽으로 한 칸 이동한다.
  2. 낚시왕이 있는 열에 있는 상어 중 가장 가까운 상어를 잡는다. 잡은 상어는 사라진다.
  3. 상어가 이동한다.

상어는 주어진 속도로 칸을 이동한다.

경계에 다다른 경우에는 방향을 반대로 바꿔서 이동한다.


풀이

  1. 상어를 객체를 만든다. (r, c, s, d, z)

  2. 초기 map과 초기 list에 모든 상어의 상태를 저장해준다.

  3. 상어 이동 메소드를 구현한다. - moveShark

    • 파라미터로 상어 객체와 그 객체의 속도를 받는다.

    • 속도가 0이 될 때까지 재귀

    • 각 방향에 while 반복을 하면서 속도가 0이 되거나 위치가 경계면에 다다르면 break해준다.

  4. for문으로 낚시꾼을 열 방향으로 이동시킨다.

    • for문으로 행이동하며 map이 null이 아니면 상어의 크기를 저장하고 상어를 제거한 뒤 break해준다.

    • arraylist를 초기화하고 현재 map의 상어들을 다시 저장한다. - list

    • 새로운 arraylist를 생성하여 moveShark메소드의 결과 상어들을 저장한다. - moveList

    • moveList의 상어들을 초기화 한 map에 저장한다

      • 이미 상어가 있으면 크기 비교를 한 뒤 큰 것을 저장한다.
    • map에 남은 상어들을 다시 list에 저장해 준다.

  5. 누적된 상어의 크기를 출력한다.

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;
	}
}

태그:

카테고리:

업데이트: