문제
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
a 부터 h로 표현한다
- c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
- a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다
접근 & 풀이 (의식의 흐름)
1. 이것도 상하좌우 문제처럼 이동하는 문제니깐 dx, dy리스트를 만들면 되려나..
2. 이동하는 경우의 수를 리스트로 만들어서 조건문을 통해 좌표 평면상을 넘어가는 경우는 제외해야겠다
3. 하다보니 열의 알파벳들을 숫자로 만들어주는것이 필요한거같음
소스코드
n = input()
row = [1, 2, 3, 4, 5, 6, 7, 8]
col = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
count = 0
# 이동하는 경우의 수 리스트
dxdy = [(2, 1), (2, -1), (-2, 1), (-2, -1), (1, 2), (1, -2), (-1, 2), (-1, -2)]
# 현재 나이트의 위치
x, y = int(n[1]), int(ord(n[0])) - int(ord('a')) + 1
# 임시로 저장할 x, y 위치
vx, vy = 0, 0
# 이동하는 경우의 수와 현재 나이트의 위치를 더했을때 0보다 크면 count +1
for i, j in dxdy:
vx = int(x) + i
vy = int(y) + j
if vx > 0 and vy > 0:
count += 1
print(count)
오답노트 & 알아간 것
- 열에 있는 알파벳을 어떻게 숫자로 표현할까 구글링해서 아스키코드 이용하는걸 알아냈다.. -> 머리좀 쓰자..
- 이동하는 경우의 수를 dx, dy따로 나타내기 힘들거같아서 둘을 묶어서 리스트로 만들었는데 다른 분들 소스코드보니깐 dx, dy를 따로나눠도 풀이가 가능했다...(그치만 책에 소스코드랑 풀이방법이 같아서 만족)
- for문에 2차원 리스트를 사용할때에는 for i, j처럼 사용할 수 있지만 배열의 인덱스에 접근해서 풀수도 있다..
for i, j in dxdy:
vx = int(x) + i
vy = int(y) + j
dxdy = [(2, 1), (2, -1), (-2, 1), (-2, -1), (1, 2), (1, -2), (-1, 2), (-1, -2)]
for i in dxdy:
vx = x + i[0] # i[0] -> 2, 2, -2, -2, 1, ..., -1
vy = y + i[1] # i[1] -> 1, -1, 1, -1, 2, ..., -2
'파이썬 > 이것이 코딩 테스트다 with 파이썬' 카테고리의 다른 글
이코테 Chapter 05 정렬 - 두 배열의 원소 교체 (0) | 2022.02.02 |
---|---|
이코테 Chapter 05 정렬 - 성적이 낮은 순서로 학생 출력하기 (0) | 2022.02.02 |
이코테 Chapter 05 정렬 - 위에서 아래로 (0) | 2022.02.02 |
이코테 Chapter 04 구현 - 시각 (0) | 2022.01.26 |
이코테 Chapter 04 구현 - 상하좌우 (0) | 2022.01.26 |