본문으로 바로가기

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


 

import java.util.Scanner;

public class Solution {
	
	static int[] dx = {1, 0, -1, 0};
	static int[] dy = {0, 1, 0, -1};

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		int T = scanner.nextInt(); // 테스트 케이스의 수
		for (int t = 1; t <= T; t++) {
			int h = scanner.nextInt(); // 게임 맵의 높이
			int w = scanner.nextInt(); // 게임 맵의 너비
			char[][] map = new char[h][w];
			int d = 0; // 0:우, 1:하, 2:좌, 3:상
			int y = 0; // 행
			int x = 0; // 열
			for (int i = 0; i < h; i++) {
				String str = scanner.next();
				for (int j = 0; j < w; j++) {
					map[i][j] = str.charAt(j);
					if (map[i][j] == '^' || map[i][j] == '<' || map[i][j] == '>' || map[i][j] == 'v') {
						y = i;
						x = j;
						if (map[i][j] == '^')
							d = 3;
						else if (map[i][j] == '<')
							d = 2;
						else if (map[i][j] == '>')
							d = 0;
						else if (map[i][j] == 'v')
							d = 1;
					}
				}
			}
			int N = scanner.nextInt(); // 사용자가 넣을 입력의 개수
			String input = scanner.next();
			
			for (int in = 0; in < input.length(); in++) {
				boolean okay = false;
				
				if (input.charAt(in) == 'U') { // 전차가 바라보는 방향을 위쪽으로 바꾸고, 한 칸 위의 칸이 평지라면 위 그 칸으로 이동한다.
					d = 3;
					map[y][x] = '^';
					if (y + dy[d] >= 0 && map[y + dy[d]][x] == '.')
						okay = true;
				}
				else if (input.charAt(in) == 'D') { // 전차가 바라보는 방향을 아래쪽으로 바꾸고, 한 칸 아래의 칸이 평지라면 위 그 칸으로 이동한다.
					d = 1;
					map[y][x] = 'v';
					if (y + dy[d] < h && map[y + dy[d]][x] == '.')
						okay = true;
				}
				else if (input.charAt(in) == 'L') { // 전차가 바라보는 방향을 왼쪽으로 바꾸고, 한 칸 왼쪽의 칸이 평지라면 위 그 칸으로 이동한다.
					d = 2;
					map[y][x] = '<';
					if (x + dx[d] >= 0 && map[y][x + dx[d]] == '.')
						okay = true;
				}
				else if (input.charAt(in) == 'R') { // 전차가 바라보는 방향을 오른쪽으로 바꾸고, 한 칸 오른쪽의 칸이 평지라면 위 그 칸으로 이동한다.
					d = 0;
					map[y][x] = '>';
					if (x + dx[d] < w && map[y][x + dx[d]] == '.')
						okay = true;
				}
				
				if (okay) {
					map[y][x] = '.';
					y += dy[d];
					x += dx[d];
					map[y][x] = '>';
				}
				
				if (input.charAt(in) == 'S') { // 전차가 현재 바라보고 있는 방향으로 포탄을 발사한다.
					int bombY = y; // 폭탄의 위치(행)
					int bombX = x; // 폭탄의 위치(열)
					while (true) {
						if (bombY + dy[d] < 0 || bombY + dy[d] >= h || bombX + dx[d] < 0 || bombX + dx[d] >= w || map[bombY+dy[d]][bombX+dx[d]] == '#') // 포탄이 강철로 만들어진 벽에 충돌하거나 게임 맵 밖으로 나가면, 아무 일도 일어나지 않는다.
							break;
						else if (map[bombY+dy[d]][bombX+dx[d]] == '*') { // 포탄이 벽돌로 만들어진 벽에 충돌하면, 벽은 파괴되어 칸은 평지가 된다.
							map[bombY+dy[d]][bombX+dx[d]] = '.';
							break;
						}
						else { // 포탄은 계속 직진한다.
							bombY += dy[d];
							bombX += dx[d];
						}
					}	
				}	
			}
			
			System.out.print("#" + t + " ");
			for (int i = 0; i < h; i++) {
				for (int j = 0; j < w; j++)
					System.out.print(map[i][j]);
				System.out.println();
			}
		}
		
		scanner.close();
	}
}