ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1873. 상호의 배틀필드 - 자바(JAVA)
    알고리즘/SW Expert Academy 2022. 2. 22. 00:01
    728x90

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

     

    SW Expert Academy

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

    swexpertacademy.com

     

    문제 해석

    전차는 하나만 존재한다.

    사용자의 전차는 사용자의 입력에 따라 격자판으로 이루어진 게임 맵에서 다양한 동작을 한다.

     

    다음 표는 게임 맵의 구성 요소를 나타낸다.

    문자 의미
    . 평지(전차가 들어갈 수 있다.)
    * 벽돌로 만들어진 벽
    # 강철로 만들어진 벽
    - 물(전차는 들어갈 수 없다.)
    ^ 위쪽을 바라보는 전차(아래는 평지이다.)
    v 아래쪽을 바라보는 전차(아래는 평지이다.)
    < 왼쪽을 바라보는 전차(아래는 평지이다.)
    > 오른쪽을 바라보는 전차(아래는 평지이다.)

    다음 표는 사용자가 넣을 수 있는 입력의 종류를 나타낸다.

    문자 동작
    U Up : 전차가 바라보는 방향을 위쪽으로 바꾸고, 한 칸 위의 칸이 평지라면 위 그 칸으로 이동한다.
    D Down : 전차가 바라보는 방향을 아래쪽으로 바꾸고, 한 칸 아래의 칸이 평지라면 그 칸으로 이동한다.
    L Left : 전차가 바라보는 방향을 왼쪽으로 바꾸고, 한 칸 왼쪽의 칸이 평지라면 그 칸으로 이동한다.
    R Right : 전차가 바라보는 방향을 오른쪽으로 바꾸고, 한 칸 오른쪽의 칸이 평지라면 그 칸으로 이동한다.
    S Shoot : 전차가 현재 바라보고 있는 방향으로 포탄을 발사한다.

     

    전차는 게임 밖으로는 이동할 수 없다.

    전차가 포탄을 발사하면, 포탄은 벽돌로 만들어진 벽 또는 강철로 만들어진 벽에 충돌하거나 게임 맵 밖으로 나갈 때까지 직진한다. ( 포탄은 게임 밖으로 나가도 아무런 일이 발생하지 않습니다.

    포탑이 벽에 부딪히면 포탄은 소멸하고, 부딪힌 벽이 벽돌로 만들어졌다면 이 벽은 파괴되어 평지로 바뀝니다.

    만약 부딪힌 벽이 강철이라면 아무 일도 일어나지 않습니다.

     

    초기 게임 맵의 상태와 사용자가 넣을 입력이 순서대로 주어질 때, 모든 입력을 처리한 뒤 게임 맵의 상태가 어떻게 되는지 구하는 프로그램을 작성하라.

     

    입력

    첫번째 줄에 테스트 케이스의 수 T가 주어진다.

    각 테스트 케이스의 첫 번째 줄에는 두 정수 H, W가 공백으로 구분되어 주어진다.

    게임 맵은 H x W 크기의 격자판입니다.

    다음 H개의 줄에는 길이가 W인 문자열이 주어집니다.

    다음 줄에는 사용자가 넣을 입력의 개수를 나타내는 정수 N(0 <= N <= 100) 이 주어집니다.

    다움 줄에는 길이가 N인 문자열이 주어집니다.

     

    출력

    각 테스트 케이스마다 #x를 출력하고 한 칸을 띄운 후, 모든 입력을 처리하고 난 후의 게임 맵을 H개의 줄에 걸쳐 출력한다.

    x는 테스트케이스 번호를 의미하며 1부터 시작한다.

     

    문제 풀이 전 설계

    문제가 요구하는 대로 구현을 해야 하며, 배열의 유효성 검사만 주의해서 해준다면 잘 풀릴 것 같다.

    tank라는 객체를 선언하여 tank의 좌표와 방향을 저장하여 관리한다.

     

     

    코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    class Tank {
    	int y;
    	int x;
    	char direct;
    }
    
    public class BattleField {
    	static char[][] gameBoard;
    	static int t, H, W;
    	static Tank tank = new Tank();
    	static BufferedReader br;
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		br = new BufferedReader(new InputStreamReader(System.in));
    
    		int T = Integer.parseInt(br.readLine());
    		for (t = 1; t <= T; t++) {
    			inputGameInfo();
    
    			int userInputCount = Integer.parseInt(br.readLine());
    			char[] userInput = br.readLine().toCharArray();
    			
    			executeUserInput(userInput);			
    			gameBoard[tank.y][tank.x] = tank.direct;			
    			printResult();
    			
    
    		}
    	}
    	static void inputGameInfo() throws IOException {
    		String str = br.readLine();
    		StringTokenizer st = new StringTokenizer(str, " ");
    		H = Integer.parseInt(st.nextToken());
    		W = Integer.parseInt(st.nextToken());
    		gameBoard = new char[H][W];
    		
    		for (int i = 0; i < H; i++) {
    			str = br.readLine();
    			for (int j = 0; j < W; j++) {
    				gameBoard[i][j] = str.charAt(j);
    
    				if (gameBoard[i][j] == '.') {
    					continue;
    				}
    				if (gameBoard[i][j] == '*') {
    					continue;
    				}
    				if (gameBoard[i][j] == '#') {
    					continue;
    				}
    				if (gameBoard[i][j] == '-') {
    					continue;
    				}
    				tank.y = i;
    				tank.x = j;
    				tank.direct = gameBoard[i][j];
    			}
    		}
    	}
    	
    	static void executeUserInput(char[] userInput) {
    		for (char c : userInput) {
    			if (c == 'S') {
    				if (tank.direct == '^') {
    					for (int i = tank.y; i >= 0; i--) {
    						// 강철 만나면 break
    						if (gameBoard[i][tank.x] == '#') {
    							break;
    						}
    						// 벽돌 만나면
    						if (gameBoard[i][tank.x] == '*') {
    							gameBoard[i][tank.x] = '.';
    							break;
    						}
    					}
    					continue;
    				}
    				if (tank.direct == 'v') {
    					for (int i = tank.y; i < H; i++) {
    						// 강철 만나면 break
    						if (gameBoard[i][tank.x] == '#') {
    							break;
    						}
    						// 벽돌 만나면
    						if (gameBoard[i][tank.x] == '*') {
    							gameBoard[i][tank.x] = '.';
    							break;
    						}
    					}
    					continue;
    				}
    				if (tank.direct == '<') {
    					for (int i = tank.x; i >= 0; i--) {
    						// 강철 만나면 break
    						if (gameBoard[tank.y][i] == '#') {
    							break;
    						}
    						// 벽돌 만나면
    						if (gameBoard[tank.y][i] == '*') {
    							gameBoard[tank.y][i] = '.';
    							break;
    						}
    					}
    					continue;
    				}
    				if (tank.direct == '>') {
    					for (int i = tank.x; i < W; i++) {
    						// 강철 만나면 break
    						if (gameBoard[tank.y][i] == '#') {
    							break;
    						}
    						// 벽돌 만나면
    						if (gameBoard[tank.y][i] == '*') {
    							gameBoard[tank.y][i] = '.';
    							break;
    						}
    					}
    					continue;
    				}
    			}
    
    			if (c == 'U') {
    				tank.direct = '^';
    				if (tank.y - 1 >= 0 && gameBoard[tank.y - 1][tank.x] == '.') {
    					gameBoard[tank.y][tank.x] = '.';
    					tank.y--;
    					gameBoard[tank.y][tank.x] = tank.direct;
    				}
    				continue;
    			}
    
    			if (c == 'D') {
    				tank.direct = 'v';
    				if (tank.y + 1 < H && gameBoard[tank.y + 1][tank.x] == '.') {
    					gameBoard[tank.y][tank.x] = '.';
    					tank.y++;
    					gameBoard[tank.y][tank.x] = tank.direct;
    				}
    				continue;
    			}
    
    			if (c == 'L') {
    				tank.direct = '<';
    				if (tank.x - 1 >= 0 && gameBoard[tank.y][tank.x - 1] == '.') {
    					gameBoard[tank.y][tank.x] = '.';
    					tank.x--;
    					gameBoard[tank.y][tank.x] = tank.direct;
    				}
    				continue;
    			}
    
    			if (c == 'R') {
    				tank.direct = '>';
    				if (tank.x + 1 < W && gameBoard[tank.y][tank.x + 1] == '.') {
    					gameBoard[tank.y][tank.x] = '.';
    					tank.x++;
    					gameBoard[tank.y][tank.x] = tank.direct;
    				}
    				continue;
    			}
    
    		}
    	}
    	static void printResult() {
    		System.out.print("#" + t + " ");
    		for (int i = 0; i < H; i++) {
    			for (int j = 0; j < W; j++) {
    				System.out.print(gameBoard[i][j]);
    			}
    			System.out.println();
    		}
    	}
    
    }

     

    댓글

Designed by Tistory.