Java/BOJ

[BOJ] 백준 1063. 킹

동구름이 2024. 5. 7. 15:11

문제

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

 


풀이

 구현 문제입니다.  입력값을 어떤 형식으로 받을 것인지, 그리고 구현을 위한 메서드를 어떻게 나누고 적용할 것인지가 중요한 포인트 같습니다.

 

 처음 구현시에 입력값도 String으로 받고 메서드를 제대로 분리하지 못했더니 너무 코드가 난잡해져서, 다시 입력 자료구조와 메서드를 정의해 문제를 해결했습니다.

 

 우선 입력 시 char[] 배열을 통해 체스의 행과 열을 각각의 인덱스에 저장을 해주었습니다.

 

 메서드는 크게 두 가지인데, chess를 옮기는 것과 범위를 체크하는 것입니다. 이 메서드를 king과 stone을 옮길 때 모두 사용할 수 있게끔 유연하게 만들어주었습니다.

 

 그리고 조건에 통과해야지만, 이동된 배열 값에 업데이트를 시키는 방식으로 풀이를 진행했습니다. 

 

 아래는 소스 코드입니다.

 


소스 코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] king = sc.next().toCharArray();
        char[] stone = sc.next().toCharArray();
        int N = sc.nextInt();
        for(int i=0;i<N;i++){
            String d = sc.next();
            char[] kingNext = king.clone();
            char[] stoneNext = stone.clone();
            moveChess(kingNext, d);
            if(!checkRange(kingNext)) continue;
            if(Arrays.equals(kingNext, stoneNext)){
                moveChess(stoneNext,d);
                if(!checkRange(stoneNext)) continue;
            }
            king = kingNext;
            stone = stoneNext;
        }
        System.out.println(king);
        System.out.println(stone);
    }

    static void moveChess(char[] next, String d){
        if(d.equals("R")){
            next[0]++;
        }
        if(d.equals("L")){
            next[0]--;
        }
        if(d.equals("B")){
            next[1]--;
        }
        if(d.equals("T")){
            next[1]++;
        }
        if(d.equals("RT")){
            next[0]++;
            next[1]++;
        }
        if(d.equals("LT")){
            next[0]--;
            next[1]++;
        }
        if(d.equals("RB")){
            next[0]++;
            next[1]--;
        }
        if(d.equals("LB")){
            next[0]--;
            next[1]--;
        }
    }

    static boolean checkRange(char[] next){
        if(next[1]<'1'||next[1]>'8'||next[0]<'A'||next[0]>'H') return false;
        else return true;
    }
}