```
백준 1063번 킹 JAVA 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 1063번 풀이
https://www.acmicpc.net/problem/1063
1063번: 킹
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는
www.acmicpc.net
백준 1063번호번 킹은
난이도 실버 등급의 문제로서
8 * 8 크기의 체스판이 주어지고
체스판에 킹의 위치와 돌의 위치가 주어지고
명령어에 따라서 킹이 움직이고
킹의 위치가 돌의 위치가 겹치면 조건에 따라서 돌도 움직이는 문제입니다.
다시 설명하면

A1 부터 H8까지의 칸을 가진 체스판이 주어질 때
킹의 위치, 돌의 위치, 명령의 개수가 한 줄에 주어지고
명령은 다음과 같습니다.
R : 한 칸 오른쪽으로
L : 한 칸 왼쪽으로
B : 한 칸 아래로
T : 한 칸 위로
RT : 오른쪽 위 대각선으로
LT : 왼쪽 위 대각선으로
RB : 오른쪽 아래 대각선으로
LB : 왼쪽 아래 대각선으로
만약 돌의 위치와 킹의 위치가 같아지면 돌도 킹이 움직이는 방향으로 같이 움직입니다.
다만 돌이나 킹이 움직이려는 위치가 판 밖이면 둘 다 움직이지 않습니다.
최종적으로 두 객체의 위치를 출력하면 되는 문제입니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
자바에서 제공하는 POINT를 사용해주고
입력받은 값을 POINT로 바꿔준 다음
private static Point strPosTo2DPos(String strPos){
final int xPos = strPos.charAt(0) - 'A';
final int yPos = strPos.charAt(1) - '1';
return new Point(xPos, yPos);
}
명령어에 따라서
조건별로 보드 안에 있는지 혹은 돌과 겹치는지에 따라서
돌을 움직여주고 출력해주면 됩니다.
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static Point kingPos = new Point();
static Point stonePos = new Point();
static final int kBoardSize = 7;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
kingPos = strPosTo2DPos(st.nextToken());
stonePos = strPosTo2DPos(st.nextToken());
int moveCnt = Integer.parseInt(st.nextToken());
for (int i = 0; i < moveCnt; i++) {
processCommand(br.readLine());
}
printPos(kingPos);
printPos(stonePos);
}
private static void printPos(Point point){
String outputStr = "";
outputStr += (char)(point.x + 'A');
outputStr += (char)(point.y + '1');
System.out.println(outputStr);
}
private static Point strPosTo2DPos(String strPos){
final int xPos = strPos.charAt(0) - 'A';
final int yPos = strPos.charAt(1) - '1';
return new Point(xPos, yPos);
}
private static boolean isInSideTheBoard(Point objPos, Point posDiff){
boolean isInside = true;
if((objPos.x + posDiff.x) > kBoardSize){
isInside = false;
} else if((objPos.x + posDiff.x) < 0){
isInside = false;
} else if((objPos.y + posDiff.y) > kBoardSize){
isInside = false;
} else if((objPos.y + posDiff.y) < 0){
isInside = false;
}
return isInside;
}
private static void processCommand(String strCommand){
Point pointDiff = new Point();
switch (strCommand)
{
case "R":
{
pointDiff.x = 1;
break;
}
case "L":
{
pointDiff.x = -1;
break;
}
case "B":
{
pointDiff.y = -1;
break;
}
case "T":
{
pointDiff.y = 1;
break;
}
case "RT":
{
pointDiff.x = 1;
pointDiff.y = 1;
break;
}
case "LT":
{
pointDiff.x = -1;
pointDiff.y = 1;
break;
}
case "RB":
{
pointDiff.x = 1;
pointDiff.y = -1;
break;
}
case "LB":
{
pointDiff.x = -1;
pointDiff.y = -1;
break;
}
default:
{
break;
}
}
if(isInSideTheBoard(kingPos, pointDiff)){
if((stonePos.x == (kingPos.x + pointDiff.x)) && (stonePos.y == (kingPos.y + pointDiff.y))){
if(isInSideTheBoard(stonePos, pointDiff)){
kingPos.setLocation((kingPos.x + pointDiff.x), (kingPos.y + pointDiff.y));
stonePos.setLocation((stonePos.x + pointDiff.x), (stonePos.y + pointDiff.y));
}
}else {
kingPos.setLocation((kingPos.x + pointDiff.x), (kingPos.y + pointDiff.y));
}
};
}
}
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Java > Java 알고리즘' 카테고리의 다른 글
백준 16435번 스네이크버드 JAVA 구현해보기 (0) | 2021.12.01 |
---|---|
백준 3054번 피터팬 프레임 JAVA 구현해보기 (0) | 2021.11.28 |
백준 20299번 3대측정 JAVA 구현해보기 (0) | 2021.11.20 |
백준 20361번 일우는야바위꾼 JAVA 구현해보기 (0) | 2021.11.20 |
백준 2338번 큰수 덧셈,뺄셈,곱셈 JAVA 구현해보기 (0) | 2021.09.17 |
```
백준 1063번 킹 JAVA 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 1063번 풀이
https://www.acmicpc.net/problem/1063
1063번: 킹
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는
www.acmicpc.net
백준 1063번호번 킹은
난이도 실버 등급의 문제로서
8 * 8 크기의 체스판이 주어지고
체스판에 킹의 위치와 돌의 위치가 주어지고
명령어에 따라서 킹이 움직이고
킹의 위치가 돌의 위치가 겹치면 조건에 따라서 돌도 움직이는 문제입니다.
다시 설명하면

A1 부터 H8까지의 칸을 가진 체스판이 주어질 때
킹의 위치, 돌의 위치, 명령의 개수가 한 줄에 주어지고
명령은 다음과 같습니다.
R : 한 칸 오른쪽으로
L : 한 칸 왼쪽으로
B : 한 칸 아래로
T : 한 칸 위로
RT : 오른쪽 위 대각선으로
LT : 왼쪽 위 대각선으로
RB : 오른쪽 아래 대각선으로
LB : 왼쪽 아래 대각선으로
만약 돌의 위치와 킹의 위치가 같아지면 돌도 킹이 움직이는 방향으로 같이 움직입니다.
다만 돌이나 킹이 움직이려는 위치가 판 밖이면 둘 다 움직이지 않습니다.
최종적으로 두 객체의 위치를 출력하면 되는 문제입니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
자바에서 제공하는 POINT를 사용해주고
입력받은 값을 POINT로 바꿔준 다음
private static Point strPosTo2DPos(String strPos){
final int xPos = strPos.charAt(0) - 'A';
final int yPos = strPos.charAt(1) - '1';
return new Point(xPos, yPos);
}
명령어에 따라서
조건별로 보드 안에 있는지 혹은 돌과 겹치는지에 따라서
돌을 움직여주고 출력해주면 됩니다.
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static Point kingPos = new Point();
static Point stonePos = new Point();
static final int kBoardSize = 7;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
kingPos = strPosTo2DPos(st.nextToken());
stonePos = strPosTo2DPos(st.nextToken());
int moveCnt = Integer.parseInt(st.nextToken());
for (int i = 0; i < moveCnt; i++) {
processCommand(br.readLine());
}
printPos(kingPos);
printPos(stonePos);
}
private static void printPos(Point point){
String outputStr = "";
outputStr += (char)(point.x + 'A');
outputStr += (char)(point.y + '1');
System.out.println(outputStr);
}
private static Point strPosTo2DPos(String strPos){
final int xPos = strPos.charAt(0) - 'A';
final int yPos = strPos.charAt(1) - '1';
return new Point(xPos, yPos);
}
private static boolean isInSideTheBoard(Point objPos, Point posDiff){
boolean isInside = true;
if((objPos.x + posDiff.x) > kBoardSize){
isInside = false;
} else if((objPos.x + posDiff.x) < 0){
isInside = false;
} else if((objPos.y + posDiff.y) > kBoardSize){
isInside = false;
} else if((objPos.y + posDiff.y) < 0){
isInside = false;
}
return isInside;
}
private static void processCommand(String strCommand){
Point pointDiff = new Point();
switch (strCommand)
{
case "R":
{
pointDiff.x = 1;
break;
}
case "L":
{
pointDiff.x = -1;
break;
}
case "B":
{
pointDiff.y = -1;
break;
}
case "T":
{
pointDiff.y = 1;
break;
}
case "RT":
{
pointDiff.x = 1;
pointDiff.y = 1;
break;
}
case "LT":
{
pointDiff.x = -1;
pointDiff.y = 1;
break;
}
case "RB":
{
pointDiff.x = 1;
pointDiff.y = -1;
break;
}
case "LB":
{
pointDiff.x = -1;
pointDiff.y = -1;
break;
}
default:
{
break;
}
}
if(isInSideTheBoard(kingPos, pointDiff)){
if((stonePos.x == (kingPos.x + pointDiff.x)) && (stonePos.y == (kingPos.y + pointDiff.y))){
if(isInSideTheBoard(stonePos, pointDiff)){
kingPos.setLocation((kingPos.x + pointDiff.x), (kingPos.y + pointDiff.y));
stonePos.setLocation((stonePos.x + pointDiff.x), (stonePos.y + pointDiff.y));
}
}else {
kingPos.setLocation((kingPos.x + pointDiff.x), (kingPos.y + pointDiff.y));
}
};
}
}
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Java > Java 알고리즘' 카테고리의 다른 글
백준 16435번 스네이크버드 JAVA 구현해보기 (0) | 2021.12.01 |
---|---|
백준 3054번 피터팬 프레임 JAVA 구현해보기 (0) | 2021.11.28 |
백준 20299번 3대측정 JAVA 구현해보기 (0) | 2021.11.20 |
백준 20361번 일우는야바위꾼 JAVA 구현해보기 (0) | 2021.11.20 |
백준 2338번 큰수 덧셈,뺄셈,곱셈 JAVA 구현해보기 (0) | 2021.09.17 |