-
1873. 상호의 배틀필드 - 자바(JAVA)알고리즘/SW Expert Academy 2022. 2. 22. 00:01728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc
문제 해석
전차는 하나만 존재한다.
사용자의 전차는 사용자의 입력에 따라 격자판으로 이루어진 게임 맵에서 다양한 동작을 한다.
다음 표는 게임 맵의 구성 요소를 나타낸다.
문자 의미 . 평지(전차가 들어갈 수 있다.) * 벽돌로 만들어진 벽 # 강철로 만들어진 벽 - 물(전차는 들어갈 수 없다.) ^ 위쪽을 바라보는 전차(아래는 평지이다.) 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(); } } }
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
1940. 가랏! RC카! (0) 2022.02.24 2805. 농작물 수확하기 - 자바(JAVA) (0) 2022.02.24 2001. 파리 퇴치 - 자바(JAVA) (0) 2022.02.23 1954. 달팽이 숫자 - 자바(JAVA) (0) 2022.02.21 1289. 원재의 메모리 복구하기 - 자바(JAVA) (0) 2022.02.18