SWEA 1873 - 상호의 배틀필드

Updated:

Java

1873 번 - 상호의 배틀필드

문제

문제 출처

접근 방법

간단한 시물레이션 문제이다.

코드

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

class Solution {
	public static void main(String []args) throws Exception {  
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int result = 0;
    	StringTokenizer st;
    	int tc = stoi(br.readLine());
    	
    	int n, m, orderN, y = 0, x = 0, sy, sx, d;
    	char map[][], dir = 0;
    	String order;
    	int dy[] = {-1, 1, 0, 0};
    	int dx[] = {0, 0, -1, 1};
    	for(int idx = 1; idx <= tc; idx++) {
    		// 게임 맵 초기 상태 입력
    		st = new StringTokenizer(br.readLine());
    		n = stoi(st.nextToken());
    		m = stoi(st.nextToken());
    		map = new char[n][m];
    		for(int i = 0; i < n; i++) {
    			map[i] = br.readLine().toCharArray();
    		}
    		// 초기 전차 위치 확인
    		for(int i = 0; i < n; i++) {
    			for(int j = 0; j < m; j++) {
	    			if(map[i][j] == '<' || map[i][j] == '^' || map[i][j] == 'v' || map[i][j] == '>') {
	    				y = i;
	    				x = j;
	    				dir = map[i][j];		// 처음 전차가 바라보는 방향 설정
	    			}
    			}
    		}
    		
    		// 전차 동작 수행
    		orderN = stoi(br.readLine());
    		order = br.readLine();
    		for(int i = 0; i < orderN; i++) {
    			switch(order.charAt(i)) {
    			case 'U':
    				map[y][x] = '^';			// 이동을 하지 않더라도 보는 방향은 바꾸어 준다.
    				dir = '^';
    				if(y - 1 >= 0 && map[y - 1][x] == '.') {
    					map[y - 1][x] = '^';
    					map[y][x] = '.';
    					y--;
    					dir = '^';
    				}
    				break;
    			case 'D':
    				map[y][x] = 'v';
    				dir = 'v';
    				if(y + 1 < n && map[y + 1][x] == '.') {
    					map[y + 1][x] = 'v';
    					map[y][x] = '.';
    					y++;
    					dir = 'v';
    				}
    				break;
    			case 'L':
    				map[y][x] = '<';
    				dir = '<';
    				if(x - 1 >= 0 && map[y][x - 1] == '.') {
    					map[y][x - 1] = '<';
    					map[y][x] = '.';
    					x--;
    					
    				}
    				break;
    			case 'R':
    				map[y][x] = '>';
    				dir = '>';
    				if(x + 1 < m && map[y][x + 1] == '.') {
    					map[y][x + 1] = '>';
    					map[y][x] = '.';
    					x++;
    					dir = '>';
    				}
    				break;
    			case 'S':
    				sy = y;
    				sx = x;
    				if(dir == '^')
    					d = 0;
    				else if(dir == 'v')
    					d = 1;
    				else if(dir == '<')
    					d = 2;
    				else
    					d = 3;
    				
    				while(true) {
    					if(sy + dy[d] < 0 || sy + dy[d] >= n || sx + dx[d] < 0 || sx + dx[d] >= m)		// 범위 밖을 벗어나면 종료
    						break;
    					sy += dy[d];
    					sx += dx[d];
    					
    					if(map[sy][sx] == '*') {			// 벽이면 파괴
    						map[sy][sx] = '.';
    						break;
    					}
    					else if(map[sy][sx] == '#')			// 강철벽이면 막히고 종료
    						break;
    				}
    				break;
    			}
    		}
    		
    		System.out.print("#" + idx + " ");
    		for(char[] vv : map) {
    			for(char v : vv) {
    				System.out.print(v);
    			}
    			System.out.println();
    		}
    	}
    	
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐★★★★

후기

기초 시뮬레이션 문제

개선할 점