알고리즘/기타

[이코테] 왕실의 나이트(그리디&구현).py

funtastie 2023. 1. 7. 03:37

▶ 문제

: 왕실의 체스판은 8 X 8 좌표 평면입니다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.

나이트는 이동 시 L자 형태로만 이동할 수 있으며, 정원 밖으로는 나갈 수 없다.

<2가지 이동 경우>

 → 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기

 → 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하시오.

행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치는 a부터 h까지 표현한다.

c2에 있을 때 이동할 수 있는 경우의 수는 6가지

 

 입력 예시

: c2

  출력 예시

: 6

 

Code
# 현재 나이트의 위치 입력받기
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)

 

 배운점

: 먼저 나이트가 이동할 수 있는 경우의 수 8가지를 정해주는 것이 핵심이다.

특히, 현재 나이트의 위치를 입력 받을 때, ord 함수를 쓰는데, 아스키 값으로 바꿔주는 함수이다.

예로) ord('1') 은 49 이고,  ord('A') 는 65 이다.

입력 예시가 c2이므로, c의 아스키 값에다가 a 아스키 값을 빼준다.

그럼 2가 되는데 c는 3번째이므로 +1 해줘서 맞춰준다.

이것도 마찬가지로 완전탐색으로 이동하는 모든 경우의 수를 돌리고,

if 문으로 정원 범위 내에 있을 때만 result값을 카운트해줘서 출력한다.

여기서 벡터의 개념이 중요한데, row는 x, column은 y 개념으로 인지해야한다.

ord('c')

 

 

출처: 

https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=2