알고리즘

[Java] SWEA - 상호의 배틀필드

J3SUNG 2023. 2. 22. 21:42
728x90

시뮬레이션 문제입니다.
탱크를 명령에 맞게 움직여서 최종적으로 map의 모습을 출력하여야 합니다.

문자열로 데이터가 들어오는데 숫자로 바꿔서 처리해주었습니다.

신경쓸만한 부분은 움직이는 곳에 방해물이 있어 못움직여도 방향을 조절해주어야는 점 정도가 있습니다.
시뮬레이션 문제는 주어진 규칙에 맞게 차례대로 구현하면 실수가 적어지는 듯 합니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
 
class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
         
        char[] c = {'^', 'v', '<', '>', '.', '*', '#', '-'};
        char[] move = {'U', 'D', 'L', 'R', 'S'};
        int ts = Integer.parseInt(br.readLine());
        for(int t=1; t<=ts; ++t) {
            st = new StringTokenizer(br.readLine());
            int h = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            int[] dy = {-1, 1, 0, 0};
            int[] dx = {0, 0, -1, 1};
            int[][] map = new int[h][w];
            int y = 0;
            int x = 0;
            int d = 0;
            String str;
            for(int i=0; i<h; ++i) {
                str = br.readLine();
                for(int j=0; j<w; ++j) {
                    for(int k=0; k<8; ++k) {
                        if(str.charAt(j) == c[k]) {
                            map[i][j] = k;
                            if(k < 4) {
                                y = i;
                                x = j;
                                d = k;
                            }
                            break;
                        }
                    }
                }
            }
            int n = Integer.parseInt(br.readLine());
            str = br.readLine();
            for(int i=0; i<n; ++i) {
                int act = 0;
                for(int j=0; j<5; ++j) {
                    if(str.charAt(i) == move[j]) {
                        act = j;
                        break;
                    }
                }
                if(act == 4) { //shoot
                    int nextY = y + dy[d];
                    int nextX = x + dx[d];
                    while(true) {                   
                        if(nextY < 0 || nextX < 0 || nextY >=h || nextX >= w) {
                            break;                      
                        }
                        if(map[nextY][nextX] == 5) {
                            map[nextY][nextX] = 4;
                            break;
                        }
                        if(map[nextY][nextX] == 6) {
                            break;
                        }
                        nextY += dy[d];
                        nextX += dx[d];
                    }
                } else { // move
                    int nextY = y + dy[act];
                    int nextX = x + dx[act];
                    if(nextY < 0 || nextX < 0 || nextY >=h || nextX >= w || map[nextY][nextX] != 4) {
                        map[y][x] = act;                    
                    }
                    else {
                        map[nextY][nextX] = act;
                        map[y][x] = 4;
                        y = nextY;
                        x = nextX;
                    }
                    d = act;
                }
            }
            bw.write("#" + t + " ");
            for(int i=0; i<h; ++i) {
                for(int j=0; j<w; ++j) {
                    bw.write(c[map[i][j]]);
                }
                bw.write("\n");
            }
        }
                 
        bw.close();
    }
}