8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오.
단, 나이트는 특정한 위치에서 다음과 같은 2가지 경우로만 이동할 수 있다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
- 입력
a1- 출력
2
모든 케이스를 구분한 풀이
position = input()
c = position[0]
r = position[1]
if 'c' <= c and c <= 'f':
if '3' <= r and r <= '6':
answer = 8
elif r == '2' or r == '7':
answer = 6
else:
answer = 4
elif c == 'b' or c == 'g':
if '3' <= r and r <= '6':
answer = 6
elif r == '2' or r == '7':
answer = 4
else:
answer = 3
else:
if '3' <= r and r <= '6':
answer = 4
elif r == '2' or r == '7':
answer = 3
else:
answer = 2
print(answer)
효율적으로 이동 가능한 경우의 수를 파악할 수 있는 알고리즘이 떠오르지 않아 전체 케이스를 구분하여 각각의 경우의 수를 파악하도록 코드를 작성하였다.
< 이것이 취업을 위한 코딩 테스트다 with 파이썬 > 답안 예시
# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1
# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
result = 0
for step in steps:
# 이동하고자 하는 위치 확인
next_row = row + step[0]
next_column = column + step[1]
# 해당 위치로 이동이 가능하다면 카운트 증가
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
result += 1
print(result)
예시 답안에서는 나이트의 가능한 이동을 배열로 만들어두고 현재 위치에서 반복문을 통해 각각의 이동이 가능한지를 확인하는 방법으로 코드를 구현하였다. 이 책에선 앞선 '상하좌우' 문제에서도 이와 비슷한 방법으로 모범답안을 작성하였는데 이 방법을 왜 생각하지 못했나싶다.
또한 ord()와 chr()을 적절히 활용하여 부등호를 다루기 쉽도록 하는 것 역시 기억해두고 사용해야겠다.
참고자료
이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈