왕실의 나이트 [구현]

Woosung Kim·2022년 2월 9일
0

구현 실전 문제

왕실의 나이트

🐾 문제 설명

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 파이썬 - 나동빈

profile
개발하는 강아지

0개의 댓글