Dazzling 개발 노트

[이것이 취업을 위한 코딩테스트다] Ch04. 구현 - 게임 개발 (Java) 본문

Algorithm

[이것이 취업을 위한 코딩테스트다] Ch04. 구현 - 게임 개발 (Java)

dj._.dazzling 2023. 7. 13. 17:05

문제

4 4
1 1 0
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1

풀이/후기

백준 로봇청소기 문제와 굉장히 유사했다.

로봇청소기 문제 풀 때 BFS로 접근해서 아주 머리아프게 풀었던 기억이 있는데...

책에선 너무 쉬운 풀이로 되어 있어서 당황했다.

그래도 방향에 대한 접근은 처음에 풀 때보다 바로 감을 잡은 것 같다.

완벽히 생각해내서 풀이하지 못한 것은 또 현타가 오지만....

그래도 접근성이라도 비슷하게 가져갔으니 전보단 나아졌다 생각해야지...

코드

package ThisIsCT;

import java.io.*;
import java.util.*;

public class ch04_04 {
	// Ch.04 구현
	// 게임 개발
	// 백준 - 14503. 로봇청소기와 유사한 문제

	static int N, M;
	static int[][] map;
	static int x,y,d;
	//북(0) 동(1) 남(2) 서(3)
	//서(좌) 북(상) 동(우) 남(하)
	static int[][] move = {{-1,0}, {0,1}, {1,0}, {0,-1}};
	static int cnt = 0;


	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer str = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(str.nextToken());
		M = Integer.parseInt(str.nextToken());
		map = new int[N+1][M+1];

		str = new StringTokenizer(br.readLine(), " ");
		x = Integer.parseInt(str.nextToken());
		y = Integer.parseInt(str.nextToken());
		d = Integer.parseInt(str.nextToken());

		for (int i=0; i<N; i++) {
			str = new StringTokenizer(br.readLine(), " ");
			for (int j=0; j<M; j++) {
				map[i][j] = Integer.parseInt(str.nextToken());
			}
		}

		map[x][y] = 99;
		cnt++;
		movingFunc(d, 0);
		System.out.println(cnt);
	}

	static void movingFunc(int D, int tempCnt) {
		int tempX = x + move[D][0];
		int tempY = y + move[D][1];

		if (map[tempX][tempY] != 1 && map[tempX][tempY] == 0) {
			// 바다가 아니면서 아직 방문하지 않은 육지인 경우
			map[tempX][tempY] = 99;	//방문하면 99로 채움
			x = tempX;
			y = tempY;
			cnt++;
			tempCnt = 0;
		} else {
			// 방문할 곳이 없는 경우
			tempCnt++;
			//왼쪽으로 회전 시 D가 점차 작아짐 : 0 > 3 > 2 > 1 > 0 ...
			D--;
			if (D < 0) D = 3;
		}

		if (tempCnt == 4) {
			//네 방향 모두 방문할 수 없는 경우 뒤로 이동
			tempX = x - move[D][0];
			tempY = y - move[D][1];
			tempCnt = 0;
			if (map[tempX][tempY] != 1 && map[tempX][tempY] == 0) {
				x = tempX;
				y = tempY;

			} else {
				return;
			}
		}

		movingFunc(D, tempCnt);

	}

}

Commit

https://github.com/allrightDJ0108/CodingTestStudy/commit/973c89505e940766de9bbb57004289826552deb5

 

이것이 취업을 위한 코딩테스트다 Ch04. 구현 - 게임 개발 · allrightDJ0108/CodingTestStudy@973c895

allrightDJ0108 committed Jul 13, 2023

github.com

참고