본문 바로가기
Algorithm/Problem Solving

[Problem Solving] 왕실의 나이트

by Kyunghoon Kim 2021. 2. 1.

구현

문제 : 왕실의 나이트

행복 왕국의 왕실 정원은 체스판과 같은 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

댓글