풀이방법
구현문제이다. 조건 식을 추가해야하는데 일단 킹의 위치와 돌의 위치를 문자열 분리하고 형변환을 통해 거기서 좌표값을 추출해 냇다.
그 뒤 해당 좌표를 가지고 상하좌우 + 우상 좌상 우하 좌하 이렇게 움직이는 로직을 짜면된다.
이런 문제는 어디서 벗어날지 모르기 때문에 예외처리를 최대한 꼼꼼하게 해주어야 한다.
아래 코드는 아직 상하좌우만 구현되어있고 정답을 좌표값으로 찍히게끔 만들어 두었는데
이걸 다시 체스좌표로 변환해서 찍어주어야하고 + 대각 방향들 이동 구현을 아직 못했다.
22.11.07 추가
자꾸 몇개가 어긋나고 좌표 헷갈리고, row 로 썻는지 col 로 썻는지 2초마다 헷갈려서 중간에 화가 너무 많이 났다.....이래서 구현이 머리가 아프구나........그래도 풀어서 다행이다.
코드(완성)
package pro;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class test4 {
private static int[] dx = { -1, 0, 1, 0 };
private static int[] dy = { 0, 1, 0, -1 };
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(); // king 1 의 위치 A1
String dol = st.nextToken(); // dol 2 의 위치 A2
// 위치를 해독해서 어디있는지찾는다
char colK = king.charAt(0);
char rowK = king.charAt(1);
int colKing = colK - 'A';
int rowKing = 8 - (rowK - '0');
char colD = dol.charAt(0);
char rowD = dol.charAt(1);
int colDol = colD - 'A';
int rowDol = 8 - (rowD - '0');
int[][] map = new int[8][8];
map[rowKing][colKing] = 1; // 킹
map[rowDol][colDol] = 2; // 돌
// System.out.println("초기위치");
// for (int o = 0; o < 8; o++) {
// for (int p = 0; p < 8; p++) {
// System.out.print(map[o][p] + " ");
// }
// System.out.println();
// }
int t = Integer.parseInt(st.nextToken());
for (int i = 0; i < t; i++) {
String com = br.readLine();
if (com.equals("B")) { // 아래
// 아래 범위 가능한지
if (rowKing + 1 >= 8) {
continue;
} else {
// 아래 돌이 있는지
if (rowKing + 1 == rowDol && colKing == colDol) {
// 돌이 있으면 돌부터 옮긴다.
if (rowDol + 1 >= 8) { // 돌이 범위밖 벗어나면 다음반복
continue;
}
else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
rowDol = rowDol + 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
rowKing = rowKing + 1;
map[rowKing][colKing] = 1;
}
}else {
// 없으면 king 아래로한칸이동
map[rowKing][colKing] = 0;
rowKing = rowKing + 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("R")) { // 오른쪽
if (colKing + 1 >= 8) {
continue;
} else {
// 오른쪽에 돌이 있는지
if (colKing + 1 == colDol && rowKing == rowDol) {
// 돌이 있으면 돌부터 옮긴다.
if (colDol + 1 >= 8) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
colDol = colDol + 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
colKing = colKing + 1;
map[rowKing][colKing] = 1;
}
}else {
// 없으면 king 오른쪽으로한칸이동
map[rowKing][colKing] = 0;
colKing = colKing + 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("L")) { // 왼쪽
if (colKing - 1 < 0) {
continue;
} else {
// 왼쪽에 돌이 있는지
if (colKing - 1 == colDol && rowKing == rowDol) {
// 돌이 있으면 돌부터 옮긴다.
if (colDol - 1 < 0) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
colDol = colDol - 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
colKing = colKing - 1;
map[rowKing][colKing] = 1;
}
}else {
// 없으면 king 왼쪽으로한칸이동
map[rowKing][colKing] = 0;
colKing = colKing - 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("T")) { // 위쪽
// 위쪽 범위 가능한지
if (rowKing - 1 < 0) {
continue;
} else {
// 아래 돌이 있는지
if (rowKing - 1 == rowDol && colKing == colDol) {
// 돌이 있으면 돌부터 옮긴다.
if (rowDol - 1 < 0) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
rowDol = rowDol - 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
rowKing = rowKing - 1;
map[rowKing][colKing] = 1;
}
}else {
// 없으면 king 위로한칸이동
map[rowKing][colKing] = 0;
rowKing = rowKing - 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("RT")) {
// 오른쪽 위 범위 가능한지
if (rowKing - 1 < 0 || colKing+1 >=8) { //오른쪽 위 한계점.
continue;
} else {
// 오른쪽 위에 돌이 있는지
if (rowKing - 1 == rowDol && colKing +1 == colDol) {
// 돌이 있으면 돌부터 오른쪽 위로 옮긴다.
if (rowDol - 1 < 0 || colDol +1 >=8) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
rowDol = rowDol - 1;
colDol = colDol + 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
rowKing = rowKing - 1;
colKing = colKing + 1;
map[rowKing][colKing] = 1;
}
}else {
//오른쪽 위 돌 없으면 king 오른쪽 위로 한칸 이동
map[rowKing][colKing] = 0;
rowKing = rowKing - 1;
colKing = colKing + 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("LT")) {
// 왼쪽 위 범위 가능한지
if (rowKing - 1 < 0 || colKing-1 < 0) { //왼쪽 위 한계점.
continue;
} else {
// 왼쪽 위에 돌이 있는지
if (rowKing - 1 == rowDol && colKing -1 == colDol) {
// 돌이 있으면 돌부터 오른쪽 위로 옮긴다.
if (rowDol - 1 < 0 || colDol -1 <0) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
rowDol = rowDol - 1;
colDol = colDol - 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
rowKing = rowKing - 1;
colKing = colKing - 1;
map[rowKing][colKing] = 1;
}
}else {
//왼쪽 위 돌 없으면 king 왼쪽 위로 한칸 이동
map[rowKing][colKing] = 0;
rowKing = rowKing - 1;
colKing = colKing - 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("RB")) {
// 오른쪽 아래 범위 가능한지
if (rowKing + 1 >= 8 || colKing+1 >=8) { //오른쪽 위 한계점.
continue;
} else {
// 오른쪽 아래에 돌이 있는지
if (rowKing + 1 == rowDol && colKing +1 == colDol) {
// 돌이 있으면 돌부터 오른쪽 아래로 옮긴다.
if (rowDol + 1 >= 8 || colDol +1 >=8) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
rowDol = rowDol + 1;
colDol = colDol + 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
rowKing = rowKing + 1;
colKing = colKing + 1;
map[rowKing][colKing] = 1;
}
}else {
//범위 밖 벗어나는지 체크
//오른쪽 위 돌 없으면 king 오른쪽 위로 한칸 이동
map[rowKing][colKing] = 0;
rowKing = rowKing + 1;
colKing = colKing + 1;
map[rowKing][colKing] = 1;
}
}
}
if (com.equals("LB")) {
// 왼쪽 아래 범위 가능한지
if (rowKing + 1 >= 8 || colKing-1 < 0) { //왼쪽 위 한계점.
continue;
} else {
// 왼쪽 아래에 돌이 있는지
if (rowKing + 1 == rowDol && colKing -1 == colDol) {
// 돌이 있으면 돌부터 왼쪽 아래로 옮긴다.
if (rowDol + 1 >= 8 || colDol -1 <0) { // 돌이 범위밖 벗어나면 다음반복
continue;
}else {
// 돌옮겨주고
map[rowDol][colDol] = 0;
rowDol = rowDol + 1;
colDol = colDol - 1;
map[rowDol][colDol] = 2;
// king 옮긴다.
map[rowKing][colKing] = 0;
rowKing = rowKing + 1;
colKing = colKing - 1;
map[rowKing][colKing] = 1;
}
}else {
//왼쪽 아래 돌 없으면 king 왼쪽 아래로 한칸 이동
map[rowKing][colKing] = 0;
rowKing = rowKing + 1;
colKing = colKing - 1;
map[rowKing][colKing] = 1;
}
}
}
// StringBuilder sbb = new StringBuilder();
// sbb.append(i+"번째 반복\n");
// sbb.append("킹의 위치 : (" + rowKing + "," + colKing+")\n");
// sbb.append("돌의 위치 : (" + rowDol + "," + colDol+")\n");
// sbb.append("킹의 위치 : (" + (char)(rowKing+'A') + "" + (8-colKing)+")\n");
// sbb.append("돌의 위치 : (" + (char)(rowDol+'A') + "" + (8-colDol)+")\n");
//
// System.out.println(sbb);
// for (int o = 0; o < 8; o++) {
// for (int p = 0; p < 8; p++) {
// System.out.print(map[o][p] + " ");
// }
// System.out.println();
// }
}
StringBuilder sb = new StringBuilder();
sb.append((char)(colKing+'A')+""+(8-rowKing)+"\n");
sb.append((char)(colDol+'A')+ ""+(8-rowDol)+"\n");
// sb.append("킹의 위치 : (" + rowKing + "," + colKing+")\n");
// sb.append("돌의 위치 : (" + rowDol + "," + colDol+")\n");
System.out.println(sb);
// for (int i = 0; i < 8; i++) {
// for (int j = 0; j < 8; j++) {
// System.out.print(map[i][j] + " ");
// }
// System.out.println();
// }
}
}
/*
* A1 A2 5 B L LB RB LT
*/
'알고리즘' 카테고리의 다른 글
백준 2564 경비원 (JAVA) (2) | 2022.11.08 |
---|---|
백준 1427 소트인사이드 (JAVA) (0) | 2022.11.08 |
백준 1417번-국회의원 선거(JAVA) (0) | 2022.11.03 |
백준 1051번 문제 : 숫자 정사각형(JAVA) (0) | 2022.11.03 |
프로그래머스 - 2xn 타일링(JAVA) (0) | 2022.09.19 |