Python/코딩테스트

[이것이 코딩 테스트다] 왕실의 나이트

프로그린 2024. 4. 8. 16:27

문제 상황

왕실의 정원은 체스판과 같이 생긴 8 by 8 평면으로 되어 있다.

왕실 정원의 특정한 한 칸에 나이트가 서 있다.

나이트의 이동 : L자 형태로만 이동을 할 수 있으며(아래 1,2 경우) 정원 밖으로는 나갈 수 없다.

  1) 수평으로 2칸 이동 뒤 수직으로 1칸 이동

  2) 수직으로 2칸 이동 뒤 수평으로 1칸 이동

아래 그림과 같이 8by8에서는 행 : 1~8, 열 : a ~ h로 표시한다.

출처: 이것이 코딩테스트다

예시상황

예시 상황 : a1에 위치해 있다면, 이동할 수 있는 경우의 수는 2가지이다.

  1. 오른쪽으로 2칸 이동 후 아래로 1칸 이동하여 : c2
  2. 아래로 2칸 이동 후 오른쪽으로 1칸 이동하기 : b3

예시 상황 : c2에 위치해 있다면, 이동할 수 있는 경우의 수는 6가지이다.

  1. 오른쪽으로 2칸 이동 후 아래로 1칸 이동 : e3
  2. 오른쪽으로 2칸 이동 후 위로 1칸 이동 : e1
  3. 왼쪽으로 2칸 이동 후 아래로 1칸 이동 : a3
  4. 왼쪽으로 2칸 이동 후 위로 1칸 이동 : a1
  5. 아래로 2칸 이동 후 오른쪽으로 1칸 이동 : d4
  6. 아래로 2칸 이동 후 왼쪽으로 1칸 이동 : b4

 

입출력 조건

- 입력 조건 : 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자를 받아서 처리할 것 : 순서는 문자열, 숫자행( 예 : a1) - - 출력 조건 : 이동할 수 있는 경우의 수 출력

 

입출력 예시

입출력 예 #1
입력 예시 : a1
출력 예시 : 2

입출력 예 #2
입력 예시 : c2
출력 예시 : 6

 

아이디어

1. 주어진 입력을 문자와 숫자로 분리하여 가로와 세로의 위치 정보로 분배
2. 가능한 8가지 이동에 대한 것을 구체화
3. 주어진 범위를 벗어나는 경우와 아닌 경우를 나누어 처리
4. 입력받은 위치에서  이동이 가능한 경우를 카운팅

구현

position = input('시작 위치를 입력하세요.')
x = int(position[1])
y = ord(position[0]) - ord('a') + 1
l_moves = [
    [-2,-1], [-2, 1], [2, -1], [2, 1], [-1, -2], [-1, 2], [1, -2], [1, 2]
]
cnt = 0
for move in l_moves:
    next_x = x + move[0]
    next_y = y + move[1]
    if next_x < 1 or next_x > 8 or next_y < 1 or next_y > 8:
        continue
    else:
        cnt += 1
print(cnt)

 

[참고]

  • ord() 함수 : 특정 문자를 아스키 코드로 변환
  • chr() 함수 : 아스키 코드값을 문자로 변환

문제 출처 : 이것이 코딩테스트다