자바로 백준 1063 풀기

hong030·2023년 7월 16일
0
  • 실버 2단계 문제

풀이)
문제 조건은 map[0][1] 과 같은 형식이 아닌 A1, B8 과 같은 형식으로 주어진다. 여지껏 풀어왔던 문제들은 모두 보편적인 이차원 배열이었지만 여기서는 이 문제만의 고유한 표기 방식을 사용했다.

하지만 여기서 초점은 결국 한 칸씩 이동할 때 row와 col이 +1,-1 이 된다는 점은 달라지지 않는다는 사실이다.

내 코드

import java.util.*;
import java.io.*;

public class boj1063 {
    static char[] king, rock;
    static int n;

    public static void main(String args[]) throws IOException {
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer stk = new StringTokenizer(bfr.readLine()," ");
        king = stk.nextToken().toCharArray(); rock = stk.nextToken().toCharArray(); n = Integer.parseInt(stk.nextToken());
        for(int i=0; i<n; i++) {
            String cmd = bfr.readLine();
            char[] next_king = move(cmd, king);
            if(isInRange(next_king)){ // 킹 움직였더니 일단 범위 안에는 있음
                if(next_king[0]==rock[0] && next_king[1]==rock[1]){ // 킹 움직였더니 돌이랑 겹치면
                    char[] next_rock = move(cmd,rock);
                    if(isInRange(next_rock)){ // 움직인 돌도 범위 안에 있으면
                        king = next_king;
                        rock = next_rock;
                    }
                    else    continue; // 돌이 범위 밖으로 나가면 이번 명령 무시
                }
                else{ // 킹 움직였더니 돌이랑 겹치진 않으면 킹만 움직이면 됨
                    king = next_king;
                }
            }
            else    continue; // 킹 움직였더니 범위 밖으로 나가면 명령 무시
        }

        bfw.write(String.valueOf(king[0]) + String.valueOf(king[1]) + "\n");
        bfw.write(String.valueOf(rock[0]) + String.valueOf(rock[1]));
        bfw.close();
    }

    static Boolean isInRange(char[] a){
        if(a[0]<'A' || a[0]>'H' || a[1]<'1' || a[1]>'8')    return false;
        else return true;
    }

    static char[] move(String cmd, char[] target){
        char[] result = target.clone();
        switch(cmd){
            case "R":
                result[0]++;
                break;
            case "L":
                result[0]--;
                break;
            case "B":
                result[1]--;
                break;
            case "T":
                result[1]++;
                break;
            case "RT":
                result[0]++;    result[1]++;
                break;
            case "LT":
                result[0]--;    result[1]++;
                break;
            case "RB":
                result[0]++;    result[1]--;
                break;
            case "LB":
                result[0]--;    result[1]--;
        }
        return result;
    }
}
profile
자바 주력, 프론트 공부 중인 초보 개발자. / https://github.com/hongjaewonP

0개의 댓글