본문 바로가기

Study Log/코딩테스트

[구현] 왕실의 나이트

728x90

난이도 ♦︎♢♢ | 풀이시간 20분 | 시간제한 1초 | 메모리제한 128MB |

[문제]

행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다

  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  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