백준 1036번 킹

이상민·2023년 9월 25일
0

알고리즘

목록 보기
62/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class King {
    static int N;
    static String king;
    static String stone;
    static String[] input;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        king = st.nextToken();
        stone = st.nextToken();
        N = Integer.parseInt(st.nextToken());
        char kingcol = king.charAt(0);
        int kingrow = king.charAt(1)-'0';
        char stonecol = stone.charAt(0);
        int stonerow = stone.charAt(1)-'0';
        input = new String[N];
        String[] answer = new String[2];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            input[i] = st.nextToken();
            answer = move(input[i],kingrow,kingcol,stonerow,stonecol);
            kingcol = answer[0].charAt(0);
            kingrow = answer[0].charAt(1) - '0';
            stonecol = answer[1].charAt(0);
            stonerow = answer[1].charAt(1) - '0';
        }
        System.out.println(answer[0]);
        System.out.println(answer[1]);

    }
    public static String[] move(String str,int kingrow,char kingcol,int stonerow,char stonecol){
        String[] answer = new String[2];
        answer[0] = kingcol+String.valueOf(kingrow);
        answer[1] = stonecol+String.valueOf(stonerow);

        int[] moving = new int[2];
        moving[0] = kingrow;
        moving[1] = kingcol;
        if (str.equals("R")){
            kingcol += 1;
        }else if (str.equals("L")){
            kingcol -= 1;
        }else if (str.equals("B")){
            kingrow -=1;
        }else if (str.equals("T")){
            kingrow +=1;
        }else if (str.equals("RT")){
            kingcol+=1;
            kingrow+=1;
        }else if (str.equals("LT")){
            kingcol-=1;
            kingrow+=1;
        }else if (str.equals("RB")){
            kingcol+=1;
            kingrow-=1;
        }else if (str.equals("LB")){
            kingcol-=1;
            kingrow-=1;
        }
        moving[0] -= kingrow;
        moving[1] -= kingcol;
        moving[0] = -moving[0];
        moving[1] = -moving[1];
        if(kingrow==stonerow&&kingcol==stonecol){//돌과 같으면
            stonerow += moving[0];
            stonecol += moving[1];
        }
        if(kingcol<65||kingrow<1||kingrow>8||kingcol>72){
            return answer;
        }
        if(stonecol<65||stonerow<1||stonerow>8||stonecol>72){
            return answer;
        }

        StringBuilder sb = new StringBuilder();
        sb.append(kingcol).append(kingrow);
        answer[0] = String.valueOf(sb);
        sb = new StringBuilder();
        sb.append(stonecol).append(stonerow);
        answer[1] = String.valueOf(sb);

        return answer;

    }
}

문제조건

  1. 문자열대로 방향 움직임
  2. 킹이 돌을 만나면, 돌이 킹과 같은 방향으로 움직임
  3. 체스판 밖으로 나가면, 그 이동은 하지 않는다.

풀이방법

  1. move함수에 입력값으로 들어온 이동정보, 현재 킹의 위치, 돌의 위치를 넘겨준다.
  2. move 함수에서는 킹,돌의 이동전 위치값을 answer값에 저장해논다.
  3. 킹의 이동전 위치를 moving에 저장해놓고, 문자열 이동정보를 토대로 킹을 이동시킨다.
  4. moving값에 이동전과 후의 차이값을 저장한다(현재 이동한 방향 저장)
  5. 만약 킹의 위치와 돌의 위치가 같다면 돌도 moving에 저장해놓은 값을 통해 이동시킨다.
  6. 만약 킹과 돌이 체스판 범위 밖이라면(A의 아스키값 65,H의 아스키값 72), 처음에 받았던 이동전 answer값을 리턴한다.
  7. 범위 안이라면 answer값에 킹과 돌의 이동 후 값을 담아서 리턴한다.
  8. 킹과 돌의 현재 위치를 초기화 시켜주고 반복을 계속한다.

후기

생각보다 조건이 까다로웠고, 문자열과 숫자의 조합이라 타입 맞추는것도 신경썼어야 했다.

profile
개린이

0개의 댓글