코딩테스트[파이썬]/이것이 코딩테스트다(이코테)

[구현] - 왕실의 나이트

softmoca__ 2024. 1. 25. 14:02
목차

나이트는  8 X 8 공간 밖으로는 나가지 못하며 L 자 형태로만 이동할 수 있다.

1. 수평으로 두칸 이동한 뒤 수직으로 한칸 이동하기

2. 수직으로 두칸 이동한 뒤 수평으로 한칸이동하기

 

행은 1~8로 표현되며 열은 a~h로 표현이 된다.

이때 행과열에 대한 정보가 주어졌을 때 나이트가 이동가능한 경우의 수를 출력하라.

 

입력 예시) 

a1

 

출력 예시)

2

 

나의 코드

col,row=(map(str,input()))

col=ord(col)
col=col-96
row=int(row)

arr=[[0]*9 for _ in range(9)]
cnt=0

dx=[-2,-2,-1,1,2,2,1,-1]
dy=[-1,1,2,2,1,-1,-2,-2]

for k in range(8):
    nx=row +dx[k]
    ny=col+dy[k]
    if 1<=nx<9 and 1<=ny<9:
        cnt+=1

print(cnt)

생각보다 입력 값을 실제로 생각하는 체크판의 숫자 좌표로 다시 바꾸는데 시간이 쬐끔 들었따,,;

문자열을 숫자로 바꾸는 방법에 대해 고민하다 결국 기억이 나지 않아 이전 내가 작성했던 파이썬 기본 문법 정리 게시물을 참고해서

ord를 사용하였다.

 

또한 아래 그림과 같이 나이트가 이동 할수 있는 경우는 최대 8가지가 있다.

위 이동에 대한 방향 벡터를 dx,dy를 사용해서 나타내었고

총 8가지 모두 시물레이션 결과 1이상 8이하  일 경우 카운팅을 해주었다.

 

 

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

전체적으로 이코테책의 풀이가 난해하고 산만한 느낌이 자꾸 든다.

가독성이 좋지 못하고 정말 딱 문법을 알고 있어 피지컬로만 짠 코드(?) 같다는 느낌이 자꾸 오넴..

 

아무튼 이번 문제에 대한 코드는 역시 나의 코드가 더 깔끔하고 나은것 같다.

 

그래도 정답 코드 중 기억해야 할 점은 문자를 정수로 변활 하는 로직은 꼭 기억해야겠다.

column = int(ord(input_data[0])) - int(ord('a')) + 1

위 코드는 ord로 정수화된걸 다시 Int로 정수화하고 있다. 그래서 아래와 같이 int 를 빼서 코드를 더 깔끔하게 하는것이 좋겠다.

column = ord(input_data[0]) - ord('a') + 1