Q. a1~h8까지의 8x8체스판에 나이트의 위치를 입력받으면
나이트가 갈 수 있는 경우의 수를 출력하는문제이다.
나이트는 우리가 체스에서 알고있는 방식으로 이동하고 체스판을 벗어날수는 없다.
예를들어 a1이라는 문자열로 입력받는다면 갈수있는 경우의수는 b3와 c2 2가지임으로 2가 출력된다.
A.
<내가 짠 코드>
r = str(input())
dx = [2, 2, -2, -2, 1, -1, 1, -1]
dy = [1, -1, 1, -1, 2, 2, -2, -2]
move_types = ['RU', 'RD', 'LU', 'LD', 'UR', 'UL', 'DR', 'DL']
count = 0
for plan in r:
for i in range(len(move_types)):
if plan == move_types[i]:
nx = x + dx[i]
ny = y + dy[i]
count += 1
if nx < 1 or ny < 1 or nx > 8 or ny > 8:
continue
x, y = nx, ny
print(count)
<코드 해설>
처음에 문자열을 입력받고(a1~h8)
말이 가는위치에 따라 좌표를 지정 해주었다.
횟수 즉, count를 출력할것임으로 count 초깃값을 0이라고 지정한다음에
ex) move_types이 RU라면 (2,1)만큼 움직이고 count를 더해주는것으로 하였다.
그리고 체스판을 벗어나면 x,y = nx,ny로 동일하게 주는것으로하였다.
<수정 >
나이트의 위치를 입력받고 몇행몇열인지 계산한다음에 더해주고 체스판안에있는지 확인해주면된다.
row= int(r[1]) 행은 두번째문자의숫자이고
column = int(ord(r[0])) 열은 첫번째 문자열을 숫자로 바꾼것이다.
RU...이렇게 입력을 받지않으므로 이렇게 쓰는것보다는
steps = [(2,1) (-2,1),(2,-1),(-2,-1),(1,2),(-1,2),(1,-2),(-1,-2)] #2,1과 1,2는 기본숫자이고 부호만 +-를 붙여주면된다. 총 8가지
for step in steps:
next_row = row + step[0]
next_column = column + step[1]
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
count += 1
print(count)
처음에 오류가 생겨서
print(row)
print(column)도 출력해봤는데 열에서 a의 아스키코드는 97임으로 97을 빼고 1을 더하는게 맞다.
<알고리즘 정리 >
처음에 문자열을 입력받고 그것에 행과 열의 위치를 구한다.
그리고 이동위치의 좌표를 지정해주고 이동이 가능하다면 count+=1을 해준다.