문제
나이트는 8x8 좌표 평면으로 이루어진 왕실 정원 안에 있으며, L자 형태로 이동할 수 있다. 정원 밖으로는 이동할 수 없다. 이 때 말하는 L자 형태의 이동은 1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동 2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동
이처럼 좌표상에서 나이트의 위치가 주어졌을 때 나이트가 이동 가능한 경우의 수를 출력하는 프로그램을 작성하시오. 이때 행 좌표는 1부터 8로, 열 좌표는 a부터 h로 표현한다.
입력 조건
1. 첫째 줄에 8x8 좌표 평면 상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.
출력 조건
1. 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
내 코드
# 8+2x8+2 의 2차원 배열을 만들고 컨트롤?
input = input()
col=0
row=int(input[1])
col_char = ['a','b','c','d','e','f','g','h']
cnt=0
# collum 입력받은 알파벳 -> 숫자 변환
for i in range(8):
if(col_char[i]==input[0]):
col = i+1
# 좌표 이동 시뮬레이션 후 조건 만족하면 카운팅
dir=[(-2,-1),(-2,+1),(+2,-1),(+2,+1),(-1,-2),(+1,-2),(-1,+2),(+1,+2)]
for i in dir:
row_check=row+i[0]
col_check=col+i[1]
if(1<=row_check<=8 and 1<=col_check<=8):
cnt+=1;
print(cnt)
해설 크게 두 단계로 나뉘어 진다. 첫 번째로 입력받은 블럭(ex. a1, c2..)을 분리하여 행과 열값으로 넣어주는 단계이다. 이때 알파벳으로 입력받은 열정보는 숫자로 변환시켜주었다. 그 후 모든 좌표 이동의 경우의 수가 담겨 있는 리스트를 선언해주고, 입력이 들어온 좌표와 연산하여 1~8사이에 들어오는 경우 카운팅해주었다. 이 부분은 교재의 답안코드와 유사하므로 따로 첨부하지 않겠음.
교재해설 입력을 받을 때 행과 열의 순서를 구분하여 예외처리를 하는 등의 추가 조건으로 문제의 난이도가 바뀔 수 있다. 다양한 유형에 대비하기 위해 파이썬 문법을 자유롭게 사용할 수 있도록 훈련하는 것이 중요하다.
평가 리스트에 데이터를 담고 추출하여 연산하는 과정을 유연하게 할 수 있어야 할 듯 하다.
참고
이것이 코딩테스트다 with Python (나동빈 저)