문제 - 왕실의 나이트


  • 8 X 8 좌표 평면이 있다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다.

  • 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.

  • 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기.
  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