< 왕실의 나이트 >
난이도 : 하
[문제]
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
a 부터 h로 표현한다
- c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
- a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다
[입력 조건]
- 첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.
[출력 조건]
- 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
[입력 예시] [출력 예시]
a1 2
영규's 아이디어
- 말이 이동할 수 있는 위치 변화량을 저장해두고, 그만큼 변했을 때도 체스 보드 안에 있는 경우만 카운트 해준다.
영규's 코드
loc = input()
# 입력 받은 loc을 정수형 변수로 바꾸는 부분이다. 0 ~ 7로 표현하였다.
row = int(loc[1]) - 1
col = ord(loc[0]) - 97 # ord는 입력된 문자의 ASCII코드를 반환해주는 함수이다.
# 나이트가 이동하는 칸의 크기를 리스트에 담았다.
d_row = [1, 1, -1, -1, 2, 2, -2, -2]
d_col = [2, -2, 2, -2, 1, -1, 1, -1]
cnt = 0
for i in range(8):
# 이동 한 위치가 체스 보드 안에 위치할 때만 카운트 해준다.
if 0 <= row + d_row[i] < 8 and 0 <= col + d_col[i] < 8:
cnt += 1
print(cnt)
아무래도 입력을 정수로 바꾸는 부분이 제일 어렵지 않을까 하는 생각이 있다. ord같은 내장 함수를 많이 알고 있으면 코딩테스트에 크게 도움이 될 것 같다.
'공부 > 이것이 코딩테스트다' 카테고리의 다른 글
알고리즘을 배우는 이유 및 커리큘럼 (0) | 2023.01.03 |
---|---|
구현 - 게임 개발 (0) | 2023.01.03 |
구현 이론 (0) | 2023.01.03 |
재귀함수 이론 (0) | 2023.01.03 |
스택과 큐 자료구조 이론 (0) | 2023.01.03 |