Junior Backend Developer

SWEA_1873, 상호의 배틀필드

이번 포스팅에선 SWEA 문제 중 하나인 1873번, 상호의 배틀필드를 풀어보고자 한다.


문제 바로가기

문제가 시키는대로 구현하면 된다.

그러나 시키는 일이 너무 많아서 문제였다.. 설명은 코드 내 주석 참조

import java.util.Scanner;

public class SWEA_1873 {

   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int T = sc.nextInt();

      for(int test_case = 1; test_case <= T; test_case++) {
         int h = sc.nextInt();
         int w = sc.nextInt();

         char[][] map = new char[h][w];

         // 맵 입력
         for(int i=0; i<h; i++) {
            char[] temp = sc.next().toCharArray();

            for(int j=0; j<w; j++) {
               map[i][j] = temp[j];
            }
         }

         int n = sc.nextInt();
         String myAction = sc.next();
         char[] myCharArr = myAction.toCharArray();

         // 내가 바라보는 방향을 나타내는 변수. 0=상, 1=하, 2=좌, 3=우
         int idx = 0;

         // 현재 내 위치
         int dx = 0;
         int dy = 0;

         // 맨 처음 전차의 위치(dx, dy)를 찾고, 현재 바라보고 있는 방향(idx) 저장
         for(int i=0; i<h; i++) {
            for(int j=0; j<w; j++) {
               if(map[i][j] == '^') {
                  idx = 0;
                  dx = i;
                  dy = j;
                  break;
               }
               else if(map[i][j] == 'v') {
                  idx = 1;
                  dx = i;
                  dy = j;
                  break;
               }
               else if(map[i][j] == '<') {
                  idx = 2;
                  dx = i;
                  dy = j;
                  break;
               }
               else if(map[i][j] == '>') {
                  idx = 3;
                  dx = i;
                  dy = j;
                  break;
               }
            }
         }

         for(int i=0; i<myAction.length(); i++) {
            // 문자가 'S' (Shoot)라면
            if (myCharArr[i] == 'S') {

               // 전차가 위를 보고 있다면
               if(dx-1 >= 0 && idx == 0) {
                  // 현재 전차 위치의 한칸 위부터 전차 열의 벽까지
                  for(int j=dx; j>=0; j--) {
                     // 전차의 위가 벽돌로 이루어진 벽이라면
                     if(map[j][dy] == '*') {
                        // 전차의 위를 평지로 바꾼다.
                        map[j][dy] = '.';
                        break;
                     }
                     // 전차의 위가 강철로 이루어진 벽이면 아무것도 하지 않는다.
                     else if(map[j][dy] == '#') {
                        break;
                     }
                     // 전차의 위가 물이거나 평지라면 아무것도 하지 않는다.(for문 계속)
                     else if(map[j][dy] == '-' || map[j][dy] == '.') {
                        continue;
                     }
                  }
               }
               // 전차가 아래를 보고 있다면
               else if(dx+1 <= h && idx == 1) {
                  // 현재 전차 위치의 한칸 아래부터 전차 열의 벽까지
                  for(int j=dx; j<h; j++) {                            
                     // 전차의 아래가 벽돌로 이루어진 벽이라면
                     if(map[j][dy] == '*') {
                        // 전차의 아래를 평지로 바꾼다.
                        map[j][dy] = '.';
                        break;
                     }
                     // 전차의 아래가 강철로 이루어진 벽이라면 아무것도 하지 않는다.
                     else if(map[j][dy] == '#') {
                        break;
                     }
                     // 전차의 아래가 물이라면 아무것도 하지 않는다(for문 계속)
                     else if(map[j][dy] == '-' || map[j][dy] == '.') {
                        continue;
                     }
                  }
               }
               // 전차가 왼쪽를 보고 있다면
               else if(dy-1 >= 0 && idx == 2) {
                  // 현재 전차 위치의 한칸 왼쪽부터 전차 행의 벽까지
                  for(int j=dy; j>=0; j--) {
                     // 전차의 왼쪽이 벽돌로 이루어진 벽이라면
                     if(map[dx][j] == '*') {
                        // 전차의 왼쪽을 평지로 바꾼다.
                        map[dx][j] = '.';
                        break;
                     }
                     // 전차의 왼쪽이 강철로 이루어진 벽이라면 아무것도 하지 않는다.
                     else if(map[dx][j] == '#') {
                        break;
                     }
                     // 전차의 왼쪽이 물이라면 아무것도 하지 않는다(for문 계속)
                     else if(map[dx][j] == '-' || map[dx][j] == '.') {
                        continue;
                     }
                  }
               }
               // 전차가 오른쪽을 보고 있다면
               else if(dy+1 <= w && idx == 3) {
                  // 현재 전차 위치의 한칸 오른쪽부터 전차 열의 벽까지
                  for(int j=dy; j<w; j++) {
                     // 전차의 오른쪽이 벽돌로 이루어진 벽이라면
                     if(map[dx][j] == '*') {
                        // 전차의 오른쪽을 평지로 바꾼다.
                        map[dx][j] = '.';
                        break;
                     }
                     // 전차의 오른쪽이 강철로 이루어진 벽이라면 아무것도 하지 않는다.
                     else if(map[dx][j] == '#') {
                        break;
                     }
                     // 전차의 오른쪽이 물이라면 아무것도 하지 않는다(for문 계속)
                     else if(map[dx][j] == '-' || map[dx][j] == '.') {
                        continue;
                     }
                  }
               }
            }
            // 문자가 'U' (Up)라면
            else if (myCharArr[i] == 'U') {
               // 먼저 바라보는 방향을 위로 바꾸고
               idx = 0;
               // 일단 전차의 머리를 돌리고
               map[dx][dy] = '^';
               // 만약 한 칸 위의 칸이 평지라면
               if(dx != 0 && map[dx-1][dy] == '.') {
                  // 현재 위치를 평지로 바꾸고
                  map[dx][dy] = '.';
                  // 나의 위치를 위로 한칸 이동한다.
                  dx--;
                  // 변경된 나의 위치에 전차를 놓는다.
                  map[dx][dy] = '^';
               }
            }
            else if (myCharArr[i] == 'D') {
               // 먼저 바라보는 방향을 아래로 바꾸고
               idx = 1;
               // 일단 전차의 머리를 돌리고
               map[dx][dy] = 'v';
               // 만약 한 칸 아래의 칸이 평지라면
               if(dx != h-1 && map[dx+1][dy] == '.') {
                  // 현재 위치를 평지로 바꾸고
                  map[dx][dy] = '.';
                  // 나의 위치를 아래로 한칸 이동한다.
                  dx++;
                  // 변경된 나의 위치에 전차를 놓는다.
                  map[dx][dy] = 'v';
               }
            }
            else if (myCharArr[i] == 'L') {
               // 먼저 바라보는 방향을 왼쪽으로 바꾸고
               idx = 2;
               // 일단 전차의 머리를 돌리고
               map[dx][dy] = '<';
               // 만약 한 칸 왼쪽의 칸이 평지라면
               if(dy != 0 && map[dx][dy-1] == '.') {
                  // 현재 위치를 평지로 바꾸고
                  map[dx][dy] = '.';
                  // 나의 위치를 왼쪽으로 한칸 이동한다.
                  dy--;
                  // 변경된 나의 위치에 전차를 놓는다.
                  map[dx][dy] = '<';
               }
            }
            else if (myCharArr[i] == 'R') {
               // 먼저 바라보는 방향을 오른쪽으로 바꾸고
               idx = 3;
               // 일단 전차의 머리를 돌리고
               map[dx][dy] = '>';
               // 만약 한 칸 오른쪽의 칸이 평지라면
               if(dy != w-1 && map[dx][dy+1] == '.') {
                  // 현재 위치를 평지로 바꾸고
                  map[dx][dy] = '.';
                  // 나의 위치를 오른쪽으로 한칸 이동한다.
                  dy++;
                  // 변경된 나의 위치에 전차를 놓는다.
                  map[dx][dy] = '>';
               }
            }



         }
         System.out.print("#" + test_case + " ");
         for(char[] temp : map) {
            for(char temp2 : temp) {
               System.out.print(temp2);
            }
            System.out.println();
         }
      }
   }
}