문제풀이

[SW Academy] 1873 상호의 배틀필드 - JAVA

자르비옹스 2022. 2. 4. 14:49

델타를 사용하여 구현하는 문제였다.

 

처음에 런타임 에러가 계속 발생하여 애를 먹었는데, 평지로 이동하는 구간에서 index 범위 체크를 하지 않았기 때문이었다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {
	static int[] dy = { -1, 0, 1, 0 };
	static int[] dx = { 0, 1, 0, -1 };
	static char[] dir = { '^', '>', 'v', '<' };
	static int currentDir = -1;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(in.readLine());
		StringBuilder sb = new StringBuilder();
		for (int tc = 1; tc <= T; tc++) {
			sb.append("#").append(tc).append(" ");
			String s = in.readLine();
			int H = Integer.parseInt(s.split(" ")[0]);
			int W = Integer.parseInt(s.split(" ")[1]);
			char[][] map = new char[H][W];
			for (int i = 0; i < H; i++) {
				map[i] = in.readLine().toCharArray();
			}
			int cmdNum = Integer.parseInt(in.readLine());
			char[] cmd = in.readLine().toCharArray();

			// LOGIC
			// 전차 위치 찾기
			int x = 0;
			int y = 0;
			boolean status = false;
			for (int i = 0; i < H; i++) {
				for (int j = 0; j < W; j++) {
					if (map[i][j] == '<' || map[i][j] == '>' || map[i][j] == 'v' || map[i][j] == '^') {
						x = j;
						y = i;
						if(map[i][j] == '^') currentDir=0;
						if(map[i][j] == '>') currentDir=1;
						if(map[i][j] == 'v') currentDir=2;
						if(map[i][j] == '<') currentDir=3;
						status = true;
						break;
					}
				} 
				if (status)
					break;
			}

			// command
			for (int i = 0; i < cmdNum; i++) {
				int idx = -1;
				if (cmd[i] == 'U') {
					idx = 0;
				} else if (cmd[i] == 'R') {
					idx = 1;
				} else if (cmd[i] == 'D') {
					idx = 2;
				} else if (cmd[i] == 'L') {
					idx = 3;
				} else if (cmd[i] == 'S') {
					// shoot
					int nextY = y+dy[currentDir];
					int nextX = x+dx[currentDir];
					while(nextY < H && nextY >= 0 && nextX < W && nextX >= 0) {
						if(map[nextY][nextX] == '*') {
							// 벽돌 벽이라면 부순다
							map[nextY][nextX] = '.';
							break;
						}else if(map[nextY][nextX] == '#') {
							// 강철 벽이라면 
							break;
						}
						nextY += dy[currentDir];
						nextX += dx[currentDir];
					}
					continue;
				}
				
				int nextY = y+dy[idx];
				int nextX = x+dx[idx];
				
				// 바라보는 방향 바꾸기
				currentDir = idx;
				if(nextY < H && nextY >= 0 && nextX < W && nextX >= 0 && map[nextY][nextX] == '.') {
					// 평지라면 GO
					map[y][x] = '.';
					y = nextY;
					x = nextX;
				}
			}
			
			// 전차 찍기
			map[y][x] = dir[currentDir];
			
			for (int i = 0; i < map.length; i++) {
				sb.append(map[i]).append('\n');
			}
		}
		System.out.println(sb);
	}
}