[문제 상황]
왕실의 정원은 체스판과 같이 생긴 8 by 8평면.
왕실 정원의 특정한 한 칸에 나이트가 서 있음.
나이트의 이동 : L자 형태로만 이동을 할 수 있음(아래 1,2경우) & 정원 밖으로는 나갈 수 없음.
1) 수평으로 2칸 이동 뒤 수직으로 1칸 이동
2) 수직으로 2칸 이동 뒤 수평으로 1칸 이동
아래 그림과 같이 8by8에서는 행 : 1~8, 열 : a ~ h로 표시
[예시 상황]
예시 상황 : a1에 위치해 있다면, 이동할 수 있는 경우의 수는 2가지이다.
1) 오른쪽으로 2칸 이동 후 아래로 1칸 이동하여 : c2
2) 아래로 2칸 이동 후 오른쪽으로 1칸 이동하기 : b3
예시 상황 : c2에 위치해 있다면, 이동할 수 있는 경우의 수는 6가지이다.
1) 오른쪽으로 2칸 이동 후 아래로 1칸 이동 : e3
2) 오른쪽으로 2칸 이동 후 위로 1칸 이동 : e1
3) 왼쪽으로 2칸 이동 후 아래로 1칸 이동 : a3
4) 왼쪽으로 2칸 이동 후 위로 1칸 이동 : a1
5) 아래로 2칸 이동 후 오른쪽으로 1칸 이동 : d4
6) 아래로 2칸 이동 후 왼쪽으로 1칸 이동 : b4
[조건]
입력 조건 : 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자를 받아서 처리할 것 :
순서는 문자열, 숫자행( 예 : a1)
출력 조건 : 이동할 수 있는 경우의 수 출력
[입출력 예시]
입력 예시 : a1
출력 예시 : 2
————
입력 예시 : c2
출력 예시 : 6
[풀이]
나이트의 이동방식은 수평 2칸 이동 & 수직 1칸 이동 혹은 수직 2칸 이동 & 수평 1칸의 두 가지 경우이다.
이동가능범위를 신경쓰지 않았을 시, L자 형태로 최대 경우의 수 4 * 2 = 8 만큼 이동이 가능하다.
-> 우선 이동 가능한 경우의 수만큼 이동하도록 설계한 후, 이동가능범위를 if문으로 설정하여 이동시킨다.
1. 범위의 문자를 숫자로 변환하여 시작 좌표 설정
example = 'a1'
move_dict = {'x':ord(example[0]) - 96,'y':int(example[1])}
move_dict
# {'x': 1, 'y': 1}
2. 이동 설계
x, y 좌표를 이동할 수 있는 총 경우의 수는 다음과 같다.
-> (x+2,y+1), (x+2,y-1), (x-2,y+1), (x-2,y-1), (x+1,y+2), (x-1,y+2), (x+1,y-2), (x-1,y-2) : 총 8개
moves = [[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[-1,2],[1,-2],[-1,-2]]
# x,y 순서대로 시작 좌표에서 이동
for move in moves:
nextx = move_dict['x'] + move[0]
nexty = move_dict['y'] + move[1]
print(nextx, nexty)
# 3 2
# 3 0
# -1 2
# -1 0
# 2 3
# 0 3
# 2 -1
# 0 -1
3. 이동가능범위 설정 후 경우의 수 출력
x, y 좌표가 각각 1 이상 8 이하의 범위 내에서만 이동이 가능하다.
cnt = 0 # 경우의 수 카운팅
for move in moves:
nextx = move_dict['x'] + move[0]
nexty = move_dict['y'] + move[1]
if (1 <= nextx <= 8) and (1 <= nexty <= 8):
cnt += 1
print(cnt)
# 2
4. 함수화
def knight(pos):
move_dict = {'x':ord(pos[0]) - 96,'y':int(pos[1])}
moves = [[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[-1,2],[1,-2],[-1,-2]]
cnt = 0
for move in moves:
nextx = move_dict['x'] + move[0]
nexty = move_dict['y'] + move[1]
if (1 <= nextx <= 8) and (1 <= nexty <= 8):
cnt += 1
return cnt
knight('a1')
# 2
knight('c2')
# 6
'ASAC 6기 > 코딩테스트' 카테고리의 다른 글
[정렬] 파일명 정렬 (0) | 2024.08.22 |
---|---|
[정렬] 실패율 (0) | 2024.08.18 |
[구현] 상하좌우 (0) | 2024.08.15 |