설명
8 x 8 체스판의 나이트가 움직일 수 있는 경우의 수를 구하라.
입력 조건
- 첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.
출력 조건
- 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오
입력 예시
a1
출력 예시
2
앞의 상하좌우 문제와 비슷한 좌표를 구하는 문제이다.
2022.07.13 - [코딩테스트 공부/이것이 코딩테스트다] - [Python][이코테] 상하좌우
처음에는 상하좌우처럼 경우의 수마다 if문으로 해결할까 했지만 총 8가지의 경우의 수에 if문을 다 걸어주는 건 너무 어리석은 행동 같아서 좀 더 머리를 굴렸다.
우선 'a1'으로 들어오는 두 글자를 좌표로 나타내기 쉽게 a를 숫자 1로 바꿔줄 필요가 있었다.
2022.01.10 - [개발/Python] - [Python] 아스키 코드, Ascii Code / 예제로 공부하는 Python 100 문제풀이
아스키코드로 변환 후 계산을 하여 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 를 하나로 묶었다고 보면 된다.
이하 코드는 동일하다.
'Algorithm > 이것이 코딩테스트다' 카테고리의 다른 글
[Python][이코테] 스택 & 큐 (0) | 2022.07.20 |
---|---|
[Python][이코테] 게임 개발 (0) | 2022.07.18 |
[Python][이코테] 시각 (0) | 2022.07.13 |
[Python][이코테] 상하좌우 (0) | 2022.07.13 |
[Python][이코테] 1이 될 때까지 (0) | 2022.07.11 |
댓글