코딩테스트/BOJ

[BOJ] 1063 킹 - JAVA

5월._. 2022. 2. 20.
728x90

1. 문제

https://www.acmicpc.net/problem/1063

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 

체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 

킹은 다음과 같이 움직일 수 있다.

  • R : 한 칸 오른쪽으로
  • L : 한 칸 왼쪽으로
  • B : 한 칸 아래로
  • T : 한 칸 위로
  • RT : 오른쪽 위 대각선으로
  • LT : 왼쪽 위 대각선으로
  • RB : 오른쪽 아래 대각선으로
  • LB : 왼쪽 아래 대각선으로

체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 

입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.


2. 풀이

거리정보를 담은 클래스를 만들었다. 행과 열 정보가 한 단어로 입력되므로 따로 string을 받는 생성자를 만들었다. 계산을 쉽게하기 위해 입력받을 때 열에는 'A'를 빼고 행에는 '1'을 뺐다.(첫번째로 시작하는 번호들)

깊은 복사를 위한 함수(set)를 만들고, toString도 오버라이딩했다. 

class Points{
   int r;
   int c;
   public Points(int r, int c){
      this.r = r;
      this.c = c;
   }
   public Points(String point){
      this.c = point.charAt(0)-'A';
      this.r = point.charAt(1)-'1';
   }
   public void set(Points p){
      this.r = p.r;
      this.c = p.c;
   }
   public void set(int r,int c){
      this.r = r;
      this.c = c;
   }

   @Override
   public String toString(){
      StringBuilder sb = new StringBuilder();
      sb.append((char)(c+'A')).append(r+1);
      return sb.toString();
   }
}

 

메인함수

이동정보는 map으로 관리했다. 

이동 명령을 받을 때마다 map에서 get한 숫자를 현재 king위치에 더했다. 

범위에 벗어난다면 다음으로 넘어간다.

돌의 위치와 king이 이동할 위치가 같지 않다면 그대로 king을 이동한다.

같다면 돌의 다음 위치를 구해서 범위에 벗어나지 않는 경우만 왕과 돌의 위치를 변경한다.

public static void main(String[] args) throws IOException {
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   StringTokenizer st = new StringTokenizer(in.readLine());

   Map<String, Points> map = new HashMap<>();
   map.put("R",new Points(0,1));
   map.put("L",new Points(0,-1));
   map.put("B",new Points(-1,0));
   map.put("T",new Points(1,0));
   map.put("RT",new Points(1,1));
   map.put("LT",new Points(1,-1));
   map.put("RB",new Points(-1,1));
   map.put("LB",new Points(-1,-1));

   Points king = new Points(st.nextToken());
   Points stone = new Points(st.nextToken());

   int N = Integer.parseInt(st.nextToken());

   while(--N>=0){
      String move = in.readLine();
      int nr = king.r + map.get(move).r;
      int nc = king.c + map.get(move).c;

      if(nr<0 || nr>=8 || nc<0 || nc>=8) continue;
      if(nr != stone.r || nc != stone.c){
         king.set(nr,nc);
      }else {
         int sr = stone.r + map.get(move).r;
         int sc = stone.c + map.get(move).c;

         if(sr<0 || sr>=8 || sc<0 || sc>=8) continue;

         king.set(stone);
         stone.set(sr,sc);
      }
   }

   System.out.println(king);
   System.out.println(stone);

}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1260 DFS와 BFS - JAVA  (0) 2022.02.20
[BOJ] 2840 행운의 바퀴 - JAVA  (0) 2022.02.20
[BOJ] 15683 감시 - JAVA  (0) 2022.02.20
[BOJ] 3060 욕심쟁이 돼지 - JAVA  (0) 2022.02.18
[BOJ] 3085 사탕게임 - JAVA  (0) 2022.02.18

댓글