문제 : 왕실의 나이트
행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다. 나이트는 말을 타고 있으므로 이동을 할 때는 L자 형태로만 이동가능하고 정원 밖으로는 나갈 수 없다. 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 두에 수평으로 한 칸 이동하기
이처럼 8 x 8 좌표 평명상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 구하여라. 행 위치의 표현은 1부터 8로 표한하고, 열 위치를 표현할 때는 a부터 h로 표현한다.
- 첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자느 a1처럼 열과 행으로 이뤄진다.
- 첫째 줄에 나이트가 이동할 수 이는 경우의 수를 출력하시오.
# 현재 나이트의 위치를 입력받는다.
position = input()
row = int(position[1]) # 행, row
# a1이 입력된다고 가정 하였을 때, ord() 내장 함수를 통해 ASCII 값으로 바꿔 위치를 구하고
# 배열은 0부터 시작인데, 값은 1부터 시작이므로 + 1을 함으로써 column의 위치를 구한다.
column = int(ord(position[0])) - int(ord('a')) + 1 # 열, column
# 나이트가 이동할 수 있는 8가지 방향
# 나이트는 수평 +2, 수직 +1 or 수직 +2, 수평 +1 이므로 이동 가능한 경우의 수는 아래와 같다.
# 즉, 아래의 경우의 수에 해당하는 경우에만 경우의 수를 1증가 시키면 된다.
steps = [(-2, 1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
count = 0
for step in steps:
# 이동하고자 하는 위치 확인
next_row = row + step[0]
next_column = column + step[1]
# 8 x 8 정원안의 범위에 속하면 이동이 가능하므로 count 증가.
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
count += 1
print(f"나이트가 이동할 수 있는 경우의 수 : {count}")
'''
입력
a1
출력
2
'''
현재 나이트의 위치를 입력받는데 입력받는 열의 값이 문자 이므로 ASCII 값으로 바꿔주어야만 나이트의 위치를 구할 수 있다. 그렇기 때문에 입력받은 나이트 행의 위치 position[0]의 값을 열 시작점인 a의 ASCII 값을 빼줌으로써 위치를 구할 수 있다. 다만 배열의 시작은 0부터이지만 값은 1부터 시작이므로 +1을 해주어야만 한다.
이 문제에서 방향 벡터는 steps가 대신한다고 볼 수 있다. row와 column의 초기 값을 설정해 주고 steps를 순회하면서 이동 가능한지 아닌지만 파악해주면 쉽게 구할 수 있는 문제였다. 하지만 초반에 개념을 잡는데 다소 시간이 걸렸던 것은 column의 값을 구하는 것과 방향 벡터를 steps를 통해 나올 수 있는 경우의 수로 대체하였기 때문에 이해하는데 시간이 조금 걸렸던것 같다.
'Algorithm > Problem Solving' 카테고리의 다른 글
[Problem Solving] 음료수 얼려 먹기 (0) | 2021.02.04 |
---|---|
[Problem Solving] 게임 개발 (0) | 2021.02.02 |
[Problem Solving] 상하좌우 (0) | 2021.02.01 |
[Problem Solving] 큰 수의 법칙 (0) | 2021.01.18 |
[Problem Solving] 거스름돈 (0) | 2021.01.18 |
댓글