일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 데이터프로그래밍
- 모의해킹
- c언어
- SQL 정리
- 백준
- 데이터베이스
- 엘라스틱서치
- 코딩테스트
- 오라클
- 프로그래밍
- SQL 문법
- 해킹실습
- 이클립스
- 문제풀이
- 리눅스마스터 2급 2차
- 필기
- 위클리챌린지
- 빅데이터
- 스파크
- 문법
- 스프링부트
- 자바
- 스프링
- 토이프로젝트
- 프로그래머스
- 알고리즘
- SQL
- 기초
- MySQL
- 파이썬
- Today
- Total
개발일기
백준 1063번 JAVA 풀이 - 킹 본문
문제 링크 : https://www.acmicpc.net/problem/1063
1063번: 킹
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는
www.acmicpc.net
문제
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다.
킹은 다음과 같이 움직일 수 있다.
- R : 한 칸 오른쪽으로
- L : 한 칸 왼쪽으로
- B : 한 칸 아래로
- T : 한 칸 위로
- RT : 오른쪽 위 대각선으로
- LT : 왼쪽 위 대각선으로
- RB : 오른쪽 아래 대각선으로
- LB : 왼쪽 아래 대각선으로
체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.
킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.
출력
첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.
# 문제 풀이
해당 문제의 주제는 구현문제 이기 때문에 문제에서 알 수 있는 조건들을 단순 구현하면 된다.
첫 번째와 두 번째 입력은 왕과 돌의 좌표가 입력된다.
이 때 A1은 가로와 세로가 붙어 있기 때문에 String 형태로 입력 받은 후 toCharArray를 사용하여 각각을 때내어 준다.
String King = sc.next();
String Stone = sc.next();
int times = sc.nextInt();
k = King.toCharArray();
s = Stone.toCharArray();
움직일 위치를 입력 받은 후 checkQ 함수를 통해 왕과 돌을 이동해준다.
for(int i = 0; i < times; i++){
String move = sc.next();
checkQ(move);
}
# checkQ
char[] k_temp = k.clone();
char[] s_temp = s.clone();
clone을 통해 새로운 배열을 만들어 준 이유는 왕과 돌이 움직인 좌표를 각각 temp에 저장한 후
1. k_temp(왕이 움직인 곳)이 좌표평면 위인가?
2. k_temp(왕이 움직인 곳)이 s(돌의 처음 위치)와 같은가?
3. s_temp(돌이 움직인 곳)이 좌표평면 위인가?
의 각각의 조건에 따라 clone 한 배열을 원래 배열에 대입하여 실제 왕 또는 돌이 이동한 것처럼 표현한다.
if(k_temp[0] >= 'A' && k_temp[0] <= 'H' && k_temp[1] >= '1' && k_temp[1] <= '8'){
if(k_temp[0] == s[0] && k_temp[1] == s[1]) {
if(s_temp[0] >= 'A' && s_temp[0] <= 'H' && s_temp[1] >= '1' && s_temp[1] <= '8'){
s = s_temp.clone();
k = k_temp.clone();
}
}
else{
k = k_temp.clone();
}
}
# 전체 코드
import java.util.*;
public class Main_1063 {
static char[] k;
static char[] s;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String King = sc.next();
String Stone = sc.next();
int times = sc.nextInt();
k = King.toCharArray();
s = Stone.toCharArray();
//System.out.println((char)(k[0] + 1));
for(int i = 0; i < times; i++){
String move = sc.next();
checkQ(move);
}
System.out.print(k[0]);
System.out.print(k[1]);
System.out.println();
System.out.print(s[0]);
System.out.print(s[1]);
}
// check king, stone position
static void checkQ(String move){
//k_temp[0] : a, b, c, d, e, f, g, h (width)
//k_temp[1] : 1, 2, 3, 4, 5, 6, 7, 8 (height)
char[] k_temp = k.clone();
char[] s_temp = s.clone();
switch(move){
case "R":
k_temp[0] += 1;
s_temp[0] += 1;
break;
case "L":
k_temp[0] -= 1;
s_temp[0] -= 1;
break;
case "B":
k_temp[1] -= 1;
s_temp[1] -= 1;
break;
case "T":
k_temp[1] += 1;
s_temp[1] += 1;
break;
case "RT":
k_temp[0] += 1;
s_temp[0] += 1;
k_temp[1] += 1;
s_temp[1] += 1;
break;
case "LT":
k_temp[0] -= 1;
s_temp[0] -= 1;
k_temp[1] += 1;
s_temp[1] += 1;
break;
case "RB":
k_temp[0] += 1;
s_temp[0] += 1;
k_temp[1] -= 1;
s_temp[1] -= 1;
break;
case "LB":
k_temp[0] -= 1;
s_temp[0] -= 1;
k_temp[1] -= 1;
s_temp[1] -= 1;
break;
}
if(k_temp[0] >= 'A' && k_temp[0] <= 'H' && k_temp[1] >= '1' && k_temp[1] <= '8'){
if(k_temp[0] == s[0] && k_temp[1] == s[1]) {
if(s_temp[0] >= 'A' && s_temp[0] <= 'H' && s_temp[1] >= '1' && s_temp[1] <= '8'){
s = s_temp.clone();
k = k_temp.clone();
}
}
else{
k = k_temp.clone();
}
}
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 20310번 풀이 : 타노스 (JAVA) (1) | 2022.10.25 |
---|---|
백준 20291번 풀이 : 파일 정리 (JAVA) (0) | 2022.10.24 |
백준 1026번 JAVA 풀이 - 보물 (2) | 2022.07.12 |
백준 2303번 JAVA 풀이 - 숫자 게임 (0) | 2022.07.11 |
백준 1431번 JAVA 풀이 - 시리얼 번호 (0) | 2022.07.07 |