백준 1063번 킹

전재우·2021년 3월 6일
0

백준 1063번 킹

백준 1063 킹

구현 전 생각

이동 메소드를 하나 만들어서
1.먼저 방향을 판단한다. (팔방탐색)
2.NX,NY 변수를 이용해서 앞으로 진행할 방향의 진행가능성을 확인한다.
3.만약에 진행하고자 하는곳에 돌이 존재하는경우
4.그 돌을 먼저 이동 시킨 후 킹의 위치도 이동 시켜준다 (이때 돌의 다음 위치를 확인)


아쉬운점

1.먼저 돌이 이동하지 못한 경우를 체크하지 못하였습니다.

  • 반례들을 보고 해결함 문제를 너무 얕게만 보지말고 깊게 생각하는 습관을 만들자.

2.dx,dy를 헷갈려서 반대로 적은것 문제를 확실히 확인 할것!

  • 전에도 같은 문제로 틀린 적 있음!!
  • 시뮬레이션에 맞게 최대한 꼼꼼히 생각 할 것!

코드(pass)

package com.study25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class backjoon_1063_킹 {
	static int[][] map = new int[8][8];
	static int x,y,sx,sy;
	//R,L,B,T,RT,LT,RB,LB
	static int[] dy= {0,0,-1,1,1,1,-1,-1};
	static int[] dx= {1,-1,0,0,1,-1,1,-1};
	public static void go (String A,int x1,int y1,int state) {
		int dir=0;
		
		switch(A) {
		case "R":
			 dir = 0;
			 break;
		case "L":
			dir = 1;
			break;
		case "B":
			dir= 2;
			break;
		case "T":
			dir = 3;
			break;
		case "RT":
			dir = 4;
			break;
		case "LT":
			dir = 5;
			break;
		case "RB":
			dir = 6;
			break;
		case "LB":
			dir = 7;
			break;
		}
		
		int nx = x1+dx[dir];
		int ny = y1+dy[dir];
		//범위를 벗어나는경우
		if(nx<0||ny<0||nx>=8||ny>=8) return;
		//돌이 이동하려고 하는곳에 있는경우
		if(map[nx][ny]==2) {
			//STATE 2로 변경해주고 GO 메소드 사용
			go(A,nx,ny,2);
			//돌이 밖으로 나가지 않은 경우를 확인하기 위한 조건문
			//돌이 밖으로 나가면 킹도 같이 나가면 안된다.
			if(map[nx][ny]==0) {
			map[x][y]=0;
			x=nx;
			y=ny;
			map[x][y]=1;
			}
			return;
		}
		//돌이 이동하는 경우
		if(state==2) {
			map[sx][sy]=0;
			sx=nx;
			sy=ny;
			map[sx][sy]=2;
			return;
		}

		//킹이 이동하는 경우
		map[x][y]=0;
		x=nx;
		y=ny;
		map[x][y]=1;

		return;
		
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		//킹의 위치
		String king = st.nextToken();
		x =king.charAt(0)-'A';
		y =king.charAt(1)-'1';

		map[x][y]=1;
		//돌의 위치
		String stone = st.nextToken();
		sx = stone.charAt(0)-'A';
		sy = stone.charAt(1)-'1';

		map[sx][sy]=2;
		int move = Integer.parseInt(st.nextToken());
		
		for (int i = 0; i < move; i++) {
			st = new StringTokenizer(br.readLine(),"  ");
			String A = st.nextToken();
			go(A,x,y,1);
		}
		char result = (char) (x+'A');
		char result2= (char) (sx+'A');
		//1로 빼주었기 때문에 +1 해야한다.
		System.out.println(result+""+(y+1));
		System.out.println(result2+""+(sy+1));
	}
}
profile
코린이

0개의 댓글