🚩 문제 설명
행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면이다.
왕실 정원의 특정한 한 칸에 나이트가 서 있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다.
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.
나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오.
이때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며,
열 위치를 표현할 때는 a부터 h로 표현한다.
예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음 2가지 이다.
a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다.
1. 오른쪽으로 두 칸 이동 후 아래로 한 칸 이동하기 (c2)
2. 아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기 (b3)
또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 겨웅의 수는 6가지 이다.
◾ 나이트가 이동할 수 있는 경우의 수를 찾는 문제
◾ 나이트가 처음 위치한 곳이 문자로 입력된다.
✅ 입출력
return ➡️ 나이트가 이동할 수 있는 경우의 수
Input | Output |
a1 | 2 |
◾ a1 에서 오른쪽으로 두 칸 이동하고 아래로 한 칸 이동하여 ➡ c2
◾ a1 에서 아래로 두 칸 이동하고 오른쪽으로 한 칸 이동하여 ➡ b3
📑 문제 풀이
with 파이썬 (Python)
cols = [chr(i) for i in range(ord('a'), ord('h')+1)]
rows = list(range(1, 9))
# chess = [[c + str(r) for c in cols] for r in rows]
steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (1, -2), (-1, -2), (1, 2), (-1, 2)]
def solution(start):
ans = 0 # 경우의 수
# 1) 위치 찾기
r = rows.index(int(start[1])) + 1
c = cols.index(start[0]) + 1
# 2) 스텝 더하기
for step in steps:
next_r = r + step[0]
next_c = c + step[1]
if next_r >= 1 and next_r <= 8 and next_c >= 1 and next_c <= 8:
ans += 1
print(ans)
return ans
# start = 'a1' # 2
start = 'c2' # 6
solution(start)
with 자바 (Java)
package problem.TC;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
//a1
//-> 2
//c2
//-> 6
// 구현 문제
public class TC_왕실의나이트 {
static int initY, initX, ans;
static int[][] map = new int[9][9]; // 0 dummy
static int[] dy = { -1, -1, 1, 1, -2, -2, 2, 2 };
static int[] dx = { -2, 2, -2, 2, -1, 1, -1, 1 };
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] loc = br.readLine().toCharArray();
initY = loc[1] - '0';
initX = loc[0] - 'a' + 1;
// System.out.println(initY + " " + initX);
for (int d = 0; d < 8; d++) {
int ny = initY + dy[d];
int nx = initX + dx[d];
if (ny < 1 || ny >= 9 || nx < 1 || nx >= 9) continue;
ans++;
}
System.out.println(ans);
}
}
💬 Point
➡️ steps 배열로 나이트가 갈 수 있는 가짓수 구해놓기
➡️ next_r, next_c 로 체스판을 넘어가는 경우 (불가능한 경우) 제외하기
➡ 알파벳 range: [chr(i) for i in range( ord('a') , ord('h') + 1) ]
➡ "문자열/배열".index("인덱스를 찾을 문자/숫자")
◾ 수평 2칸 수직 1칸
- (0, -1) + (0, -1) + (-1, 0) = (-1, -2)
- (0, -1) + (0, -1) + (1, 0) = (1, -2)
- (0, 1) + (0, 1) + (-1, 0) = (-1, 2)
- (0, 1) + (0, 1) + (1, 0) = (1, 2)
◾ 수직 2칸 수평 1칸
- (-1, 0) + (-1, 0) + (0, -1) = (-2, -1)
- (-1, 0) + (-1, 0) + (0, 1) = (-2, 1)
- (1, 0) + (1, 0) + (0, -1) = (2, -1)
- (1, 0) + (1, 0) + (0, 1) = (2, 1)
◾ 나이트가 갈 수 있는 이동 가짓수를 구하여 steps 배열로 만든다.
◾ 만약 체스판 이내에 있게 되면 카운트 해준다.
728x90
'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 이것이 코딩 테스트다' 카테고리의 다른 글
[TC0501] [DFS/BFS] 음료수 얼려 먹기 (0) | 2021.11.29 |
---|---|
[TC0404] [구현] 게임 개발 (0) | 2021.11.24 |
[TC0402] [구현] 시각 (0) | 2021.11.21 |
[TC0302] [그리디] 큰 수의 법칙 (0) | 2021.11.16 |
[TC0301] [그리디] 거스름돈 (0) | 2021.11.16 |