728x90
난이도 ♦︎♢♢ | 풀이시간 20분 | 시간제한 1초 | 메모리제한 128MB |
[문제]
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하라.
왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a 부터 h로 표현한다.
[입력조건]
- 첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.
[출력조건]
- 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
[해설]
- 상하좌우 문제와 비슷하다. 나이트가 이동할 수 있는 경로를 하나씩 확인한다.
- 단 좌표 평면을 벗어나지 않도록 하기 위한 예외 처리를 추가해야한다.
- 나이트의 이동경로를 변수에 담아 이동가능한 케이스 중에서 움직이도록 해야한다.
[소스코드]
# 나이트의 현재 위치를 입력한다
nightloc = input()
# 8*8 판에서 나이트의 위치에서 이동할수 있는 경우의 수를 찾아야한다.
# 현재위치를 세팅 col = a~h
# ord 로 문자형의 유니코드를 알아낸다
col = int(ord(nightloc[0])) - int((ord('a'))) + 1
row = int(nightloc[1])
# 나이트의 가능 이동방향 8가지 케이스
steps = [(-2,1),(-2,-1),(2,1),(2,-1),(1,-2),(1,2),(-1,2),(-1,-2)]
# 현재 위치에서 이동가능한 경우의 수는?
result = 0
for step in steps :
x = col + step[0]
y = row + step[1]
# 해당 위치로 이동이 가능하다면 카운트 증가
if x >= 1 and y >= 1 and x <= 8 and y <= 8 :
result += 1
print(result)
[느낀점]
상하좌우 문제와 같다고 느끼고 비슷하게 문제에 접근해보았는데 생각보다 케이스가 다르게 해설되어있어서 하나하나 코드를 다시 살펴보게 되었다. 앞서 상하좌우 문제에서는 dx, dy 리스트를 선언하여 이동할 방향을 기록할 수 있도록 하였는데 이번에는 steps 변수가 dx, dy 기능을 대신하여 수행하였다. 둘 다 자주 사용된다고 하는데 어떤 방식이든 잘 생각해보고 구현할 수 있도록 유의하여야할 것같다.
특히나 검사해야하는 예외 케이스에 대한 처리를 잘 할 수 있도록 연습해봐야겠다.
반응형
'Study Log > 코딩테스트' 카테고리의 다른 글
[구현] 게임 개발 (0) | 2023.05.11 |
---|---|
[구현] 시각 (0) | 2023.05.09 |
[구현] 상하좌우 (0) | 2023.05.08 |
[그리디] 1이 될 때까지 (0) | 2023.04.17 |
[그리디] 숫자 카드 게임 (0) | 2023.04.17 |