안녕하세요.
이번 포스팅은 Cos Pro 1급 java 3차 기출문제 3번문제인 비숍으로부터 도망쳐 문제를 풀어보겠습니다.
이 문제는 체스와 나이트에서 좀 더 응용된 문제같네요
drcode-devblog.tistory.com/114
□ 문제설명
체스에서 비숍(Bishop)은 아래 그림과 같이 대각선 방향으로 몇 칸이든 한 번에 이동할 수 있습니다. 만약, 한 번에 이동 가능한 칸에 체스 말이 놓여있다면 그 체스 말을 잡을 수 있습니다.
8 x 8 크기의 체스판 위에 여러 개의 비숍(Bishop)이 놓여있습니다. 이때, 비숍(Bishop)들에게 한 번에 잡히지 않도록 새로운 말을 놓을 수 있는 빈칸의 개수를 구하려고 합니다.
위 그림에서 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 50개입니다.
8 x 8 체스판에 놓인 비숍의 위치 bishops와 bishops의 길이 bishops_len이 매개변수로 주어질 때, 비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸 개수를 return 하도록 solution 함수를 완성해주세요.
□ 매개변수 설명
체스판에 놓인 비숍의 위치 bishops와 bishops의 길이인 bishops_len이 solution 함수의 매개변수로 주어집니다.
- bishops는 비숍의 위치가 문자열 형태로 들어있는 배열입니다.
- bishops_len은 64 이하인 자연수입니다.
- 비숍이 놓인 위치는 알파벳 대문자와 숫자로 표기합니다.
- 알파벳 대문자는 가로 방향, 숫자는 세로 방향 좌표를 나타냅니다.
- 예를 들어 위 그림에서 비숍이 있는 칸은 "D5"라고 표현합니다.
- 한 칸에 여러 비숍이 놓이거나, 잘못된 위치가 주어지는 경우는 없습니다.
□ return 값 설명
비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸의 개수를 return 해주세요.
□ 예시
bishops | bishops_len | return | |
예시 #1 | ["D5"] | 1 | 50 |
예시 #2 | ["D5", "E8", "G2"] | 3 | 42 |
□ 예시설명
예시 #1
문제에 나온 예시와 같습니다.
예시 #2
그림과 같이 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 42개입니다.
※ 문제 접근 방식
(1) bishops의 길이만큼 while문을 순환합니다.
(2) 이차원 배열을 선언해서 비숍이 지나가거나 있는 곳은 1로 처리합니다.
(3) i번째 비숍을 받아서 위치를 이동시켜가며 이차원 배열의 x,y 값을 채워갑니다.
(4) 이중 for문으로 배열의 1이 아닌 곳을 카운트합니다.
package runFromBishop;
public class RunFromBishop {
public static void main(String[] args) {
Main sol = new Main();
String[] bishops1 = {new String("D5")};
int ret1 = sol.solution(bishops1);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret1 + " 입니다.");
String[] bishops2 = {new String("D5"), new String("E8"), new String("G2")};
int ret2 = sol.solution(bishops2);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret2 + " 입니다.");
}
}
class Main {
public int solution(String[] bishops) {
int answer = 0;
int[][] arr = new int[8][8];
int i = 0;
while(i < bishops.length) {
String str = bishops[i];
String[] temp = str.split("");
int y = Integer.parseInt(temp[1]) - 1;
int x = 0;
switch(temp[0]) {
case "A" : x = 0; break;
case "B" : x = 1; break;
case "C" : x = 2; break;
case "D" : x = 3; break;
case "E" : x = 4; break;
case "F" : x = 5; break;
case "G" : x = 6; break;
case "H" : x = 7; break;
}
arr[y][x] = 1;
int initX = x, initY = y;
int dir = 0;
while(dir < 4) {
x = initX; y = initY;
while(dir == 0 && x > 0 && y > 0) arr[--y][--x] = 1;
while(dir == 1 && x > 0 && y < 7) arr[++y][--x] = 1;
while(dir == 2 && x < 7 && y > 0) arr[--y][++x] = 1;
while(dir == 3 && x < 7 && y < 7) arr[++y][++x] = 1;
dir++;
}
i++;
}
answer = arr.length * arr[0].length;
for (int j = 0; j < arr.length; j++) {
for (int k = 0; k < arr.length; k++) {
if(arr[j][k] == 1) answer--;
}
}
return answer;
}
}
'코딩테스트 > Cos Pro 1급 Java' 카테고리의 다른 글
[Cos Pro 1급 java] [3차] 문제5) 전광판 문구 출력 (0) | 2021.03.17 |
---|---|
[Cos Pro 1급 java] [3차] 문제4) 중복 문자열 이어붙이기 (0) | 2021.03.17 |
[Cos Pro 1급 java] [2차] 문제8) 규칙에 맞는 배열 구하기 (0) | 2021.03.16 |
[Cos Pro 1급 java] [2차] 문제7) 거스름돈 구하기 - 탐욕법 문제(그리디 알고리즘) (0) | 2021.03.16 |
[Cos Pro 1급 Java] [2차] 문제6) 로봇을 움직여주세요 (0) | 2021.03.16 |
댓글