깡뇽

[코테] 구현 문제풀기 - 왕실의 나이트 본문

Algorithm/Coding Test

[코테] 구현 문제풀기 - 왕실의 나이트

깡뇽 2022. 2. 3. 23:56
반응형

Day6

구현 문제풀기 - 왕실의 나이트 (난이도 하)

 

<문제>

나이트가 8 X 8 좌표 평면에서 L자 형태로만 이동할 수 있을 때, 나이트의 이동 경로 경우의 수를 출력해야 한다. 행 위치는 1~8, 열 위치는 a~h로 표현한다.

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

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

ex) 나이트의 위치 : a1 →  2가지 경우(1. c2 / 2. b3)

 

<조건>

첫째 줄 : 나이트의 현재 위치 좌표 문자열 입력.

 

왕실의 나이트 풀이

from string import ascii_lowercase

alphabets = list(ascii_lowercase) #알파벳 소문자 리스트 생성
n = input()
w = alphabets.index(n[0]) + 1 #알파벳 리스트에서 입력받은 알파벳을 찾은 후 정수로 변환
h = int(n[1])
cnt = 0

#수평2,수직1 또는 수평1,수직2의 경우
direction = [(-2, -1),(-2,1),(2,-1),(2,1),(-1,-2),(-1,2),(1,-2),(1,2)]

for i in range(0, len(direction)):
  nw = w + direction[i][0]
  nh = h + direction[i][1]

  #8X8을 벗어나면 무시하기
  if nw < 1 or nw > 8 or nh < 1 or nh > 8 :
    continue
  #무사히 이동할 수 있다면 카운트
  else:
    cnt += 1

print(cnt)

이동 가능한 방향들의 조합을 좌표로 표현하고, 8X8을 벗어나지 않을 때에만 카운트를 진행한다. 구현 알고리즘들 중에서 좌표 or 이동 이런 문제들은 가능한 조합들을 고려하여 반복문을 돌려서 확인해주는 것이 포인트인 것 같다.

 

#1

#2


+ 기억하고 넘어가자

1번. 소문자 알파벳 활용

from string import ascii_lowercase

→  a ~ z 리스트 만들기 : alphabets = list(ascii_lowercase) 

→ a ~ z가 key, 0을 value로 가지는 딕셔너리 만들기:

    alphabets = {}

    for i in ascii_lowercase:

        alphabets[i] = 0

 

2번. 아스키 ↔ 숫자

ord( ) : 아스키코드를 넣으면 숫자 반환

ord('a') = 97

ord는 ordinal의 약자

chr( ) : 숫자를 넣으면 아스키코드 반환

ord('65') = A 

chr는 character의 약자

 

3번. 아스키 숫자 변환 표현

w = int( ord( n[0] ) ) - int( ord( 'a' ) ) + 1 

문제 풀이에서 w에 할당되는 문자를 알파벳 리스트에서 찾아 인덱스 숫자를 활용하는데 대신에 뺄셈을 활용하는 것이다. a 뒤에 있는 문자들의 숫자에서 a의 숫자를 빼주면 차이값이 나오기 때문이다..! 아주 단순히 표현하면 ord('b') - ord('a')를 하면 1이 나오는데 a가 기준이자 1이므로 b는 2가 되며, 알파벳과 a의 숫자값 차이에 1을 더하면 a가 1일 때 각 알파벳의 번호를 구할 수 있다.

 

반응형