Algorithm

SW Expert Academy_상호의 배틀필드

Young_J 2020. 9. 22. 10:09

알고리즘

1. 시뮬레이션 문제

2. 주어진 조건을 자세히 보고 구현하면 됨.

3. 상하좌우 배열을 만들어서 풀면 쉬움.

4. 체력이 많이 필요한 문제..

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Solution {
	static int T, H, W, r, c, N;
	static char[][] map;
	static int[] dr = { -1, 1, 0, 0, };
	static int[] dc = { 0, 0, -1, 1 };

	public static void main(String[] args) throws FileNotFoundException {
		// System.setIn(new FileInputStream("building.txt"));
		Scanner sc = new Scanner(System.in);

		T = sc.nextInt();

		for (int tc = 1; tc <= T; tc++) {
			H = sc.nextInt();
			W = sc.nextInt();

			map = new char[H][W];
			for (int i = 0; i < H; i++) { // map 만들기
				String str = sc.next();
				for (int j = 0; j < W; j++) {
					map[i][j] = str.charAt(j);
					if (str.charAt(j) == '<' || str.charAt(j) == '>' || str.charAt(j) == '^' || str.charAt(j) == 'v') {
						r = i;
						c = j;
					}
				}
			}

			N = sc.nextInt();
			String st = sc.next();

			for (int i = 0; i < N; i++) { // 명령 횟수만큼 반복
				char order = st.charAt(i);
				int nr, nc;

				switch (order) {
				case 'U':
					nr = r + dr[0];
					nc = c + dc[0];
					map[r][c] = '^';
					if (nr >= 0 && nr < H && nc >= 0 && nc < W) { // 테투리 체크
						if (map[nr][nc] == '.') {
							map[r][c] = '.';
							map[nr][nc] = '^';
							r = nr;
							c = nc;
						}

					}

					break;
				case 'D':
					nr = r + dr[1];
					nc = c + dc[1];
					map[r][c] = 'v';
					if (nr >= 0 && nr < H && nc >= 0 && nc < W) { // 테투리 체크
						if (map[nr][nc] == '.') {
							map[r][c] = '.';
							map[nr][nc] = 'v';
							r = nr;
							c = nc;
						}
						
					}

					break;
				case 'L':
					nr = r + dr[2];
					nc = c + dc[2];
					map[r][c] = '<';
					if (nr >= 0 && nr < H && nc >= 0 && nc < W) { // 테투리 체크
						if (map[nr][nc] == '.') {
							map[r][c] = '.';
							map[nr][nc] = '<';
							r = nr;
							c = nc;
						}
						
					}

					break;
				case 'R':
					nr = r + dr[3];
					nc = c + dc[3];
					map[r][c] = '>';
					if (nr >= 0 && nr < H && nc >= 0 && nc < W) { // 테투리 체크
						if (map[nr][nc] == '.') {
							map[r][c] = '.';
							map[nr][nc] = '>';
							r = nr;
							c = nc;
						}
					}

					break;
				case 'S':
					if (map[r][c] == '^') {
						for (int j = r - 1; j >= 0; j--) {
							if (map[j][c] == '#') {
								break;
							}
							if (map[j][c] == '*') {
								map[j][c] = '.';
								break;
							}
						}
					} else if (map[r][c] == 'v') {
						for (int j = r + 1; j < H; j++) {
							if (map[j][c] == '#') {
								break;
							}
							if (map[j][c] == '*') {
								map[j][c] = '.';
								break;
							}
						}

					} else if (map[r][c] == '<') {
						for (int j = c - 1; j >= 0; j--) {
							if (map[r][j] == '#') {
								break;
							}
							if (map[r][j] == '*') {
								map[r][j] = '.';
								break;
							}
						}
					} else if (map[r][c] == '>') {
						for (int j = c + 1; j < W; j++) {
							if (map[r][j] == '#') {
								break;
							}
							if (map[r][j] == '*') {
								map[r][j] = '.';
								break;
							}
						}
					}

					break;
				}
			}
			System.out.print("#" + tc + " ");
			for (int i = 0; i < H; i++) {
				for (int j = 0; j < W; j++) {
					System.out.print(map[i][j]);
				}
				System.out.println();
			}
		}
		sc.close();
	}

}