본문 바로가기
Algorithm/이것이 코딩테스트다

[Python][이코테] 왕실의 나이트

by 애기 개발자 2022. 7. 15.
반응형

설명

8 x 8 체스판의 나이트가 움직일 수 있는 경우의 수를 구하라.

 

 

입력 조건

  • 첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.

 

출력 조건

  • 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오

 

입력 예시

a1

 

출력 예시

2

 

 


 

 

앞의 상하좌우 문제와 비슷한 좌표를 구하는 문제이다.

 

2022.07.13 - [코딩테스트 공부/이것이 코딩테스트다] - [Python][이코테] 상하좌우

 

[Python][이코테] 상하좌우

조건 여행가 A는 N x N크기의 정사각형 공간 위에 서있다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당한다. 각 L R U D

baby-dev.tistory.com

 

처음에는 상하좌우처럼 경우의 수마다 if문으로 해결할까 했지만 총 8가지의 경우의 수에 if문을 다 걸어주는 건 너무 어리석은 행동 같아서 좀 더 머리를 굴렸다.

 

우선 'a1'으로 들어오는 두 글자를 좌표로 나타내기 쉽게 a를 숫자 1로 바꿔줄 필요가 있었다.

 

2022.01.10 - [개발/Python] - [Python] 아스키 코드, Ascii Code / 예제로 공부하는 Python 100 문제풀이

 

[Python] 아스키 코드, Ascii Code / 예제로 공부하는 Python 100 문제풀이

학부시절 이거 어디에 쓰는거야? 싶지만서도 막상 쓸곳이 어딘가는 있었고 막상 쓰려고하니 기억안나는 바로 그 기능 아스키 코드이다. 바로 코드로 보자 #8 아스키 코드 # 대문자 A - 65 # 소문자

baby-dev.tistory.com

아스키코드로 변환 후 계산을 하여 a = 1, b = 2... 가 되도록 바꿔 주었고

 

앞의 상하좌우 문제처럼 각 좌표를 리스트로 만들어서 계산 후 if문을 적용시켜주는 쪽으로 하였다.

 

data = input()

x = data[0]
y = int(data[1])

x = int(ord(x)) - int(ord('a'))+1

result = 8

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

for i in range(8):
    ox = x + dx[i]
    oy = y + dy[i]
    if ox < 1 or oy < 1 or ox > 8 or oy > 8:
        result -= 1
        
print(result)

 

 

여기서 나는 

 

if ox < 1 or oy < 1 or ox > 8 or oy > 8:
        result -= 1

위의 방식으로 최대 경우의 수 8에서 예외를 빼주는 or 방식을 사용하였으나

 

만약에 정말 대용량의 데이터를 처리해야하고 0.00001초도 아껴야 한다면

 

모든 비교를 해야 하는 or보단 하나만 틀려도 넘어가지는 and 비교를 하며 result += 1을 해주는 게 좀 더 나아보이기도 한다.

 

바꿔보면

 

if ox >= 1 and oy >= 1 and ox <= 8 and oy <= 8:
        result += 1

위의 방식으로 1 <= x, y <= 8 이 되도록 and 조건을 걸면서 충족시키면 result를 +1 하는 방식도 좋을 것 같다.

 

 


저자의 정답 코드

 

# 4-3 구현 예제 왕실의 나이트

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

 

저자는 steps 리스트 안에 튜플의 값을 넣어서 

 

steps의 반복문을 돌리며 step[0] - row / step[1] - column 으로 비교를 하였다.

 

내 코드의 dx / dy 를 하나로 묶었다고 보면 된다.

 

이하 코드는 동일하다.

반응형

댓글