문제 - 왕실의 나이트
-
8 X 8 좌표 평면이 있다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다.
-
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.
-
나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기.
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기.
- 8 X 8 좌표 평면상에 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하라.
제한 사항
- 왕실의 정원에서 행을 표시할 때는 1 ~ 8로 표시하고, 열 위치를 표현할 때는 a ~ h로 표현한다.
아이디어
-
이동할 수 있는 좌표를 X, Y로 나누어서 리스트에 담는다. 총 8개가 나온다.
-
각각 좌표를 순회하면서 범위에 넘지 않으면 개수를 더한다.
-
개수를 출력한다.
코드
solution(x: int, y: int) -> int:
count = 0
xx = [-2, -1, 1, 2, 2, 1, -1, -2]
yy = [1, 2, 2, 1, -1, -2, -2, -1]
for i in range(len(xx)):
if 1 <= (x + xx[i]) <= 8 and 1 <= y + yy[i] <= 8:
count += 1
return count
def solution2():
input_data = input()
x = int(input_data[1])
y = int(ord(input_data[0])) - int(ord('a')) + 1
steps = [
(-2, -1), (-1, -2), (1, -2), (2, -1),
(2, 1), (1, 2), (-1, 2), (-2, 1)
]
result = 0
for step in steps:
next_row = x + step[0]
next_col = y + step[1]
if 1 <= next_row <= 8 and 1 <= next_col <= 8:
result += 1
print(result)
if __name__ == '__main__':
split = list(input())
hash_table = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8}
print(solution(hash_table[split[0]], int(split[1]))
개선할 점
-
튜플로 좌표를 해결하니 조금 더 가독성이 좋아지는 것 같다.
-
붙어 있는 문자열을 각각 분리하는 방법이 여러 가지가 있는 것 같다.
참고 문헌
>> Home