본문 바로가기

알고리즘 삽질장

[이코테] 구현 - 왕실의 나이트

반응형

해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다. 

 


문제설명

왕실 정원은 8 by 8 좌표 평면이다. 왕실의 나이트는 다음과 같이 L자 형태로 움직일 수 있다.

  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

좌표평면의 가로, 세로는 다음과 같으며 나이트의 초기 위치가 가로, 세로 문자열을 합쳐서 주어진다. 예를 들어, a1로 주어진다면 가장 왼쪽의 위 좌표를 의미한다.

 

좌표평면

입력조건

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

출력조건

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

사고과정

  • 저번에 풀어보았던 상하좌우 문제랑 비슷하다. 이번엔 8 by 8 좌표평면 2차원 배열을 굳이 만들지 않고 잘 해결함
  • 은근 시간이 걸렸던 점은 문자열로 주어지는 좌표 위치를 숫자로 바꾸는 데 은근 걸림.. Python 내장 유니코드 문자열을 숫자로 바꾸어주는 ord 메소드를 적절히 사용

풀이

1. 나의 풀이

책의 풀이와는 입력되는 열 문자열에 대해 ord 메소드를 사용하는 방식만 다름. 책의 풀이가 더 직관적인 듯 함..

location = input()

# 내 풀이
# x, y = int(location[1]), ord(location[0]) - 96

# 책 풀이
x = int(location[1])
y = ord(location[0]) - ord('a') + 1

count = 0
directions = [(1, 2), (1, -2), (-1, 2), (-1, -2),
              (2, 1), (2, -1), (-2, 1), (-2, -1)]

for d in directions:
    nx = x + d[0]
    ny = y + d[1]
    if nx < 1 or nx > 8 or ny < 1 or ny > 8:
        continue
    else:
        count += 1

print(count)
반응형