안녕하세요. Harry입니다.
본 포스팅의 목적은, 코딩테스트를 준비함에 있어 '이것이 코딩테스트다'에 제시된 문제 풀이와 스스로 얻은 정보를 정리하고자 합니다.
그러므로 단순히 문제를 푸는 것이 중요한 것이 아니라, 문제를 통해 얻어가는 것이 있어야하기 때문에 접근 방식은 이전 기초 300제를 풀었을 때랑 동일합니다.
[접근 방식]
- 문제에서 요구하는 역량은 무엇인지?
- 알고 있어야하는 지식은 무엇인지? 에 기반하여 풀이하고자 합니다.
문제
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
a 부터 h로 표현한다
- c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
- a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다
입력
첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.
출력
첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
입력 예시
a1
출력 예시
2
[풀이]
n = input()
map_x = ['a','b','c','d','e','f','g','h']
for i in range(len(map_x)):
if map_x[i] in n:
x = i+1
y = int(n[-1])
moves = [[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[-1,2],[1,-2],[-1,-2]]
count = 0
for move in moves:
dx = move[0] + x
dy = move[-1] + y
if dx < 1 or dx > 8 or dy < 1 or dy > 8:
continue
else:
count += 1
print(count)
전형적인 좌표문제입니다.
단 열을 나타내는 단위가 숫자가 아닌 알파벳이므로, 먼저 알파벳을 숫자로 바꿔주는 코드를 작성했습니다.
이후 moves 리스트에서 말이 움직일 수 있는 좌표를 선정했습니다.
for 문을 통해 입력받은 최초의 좌표에서 말이 움직일 수 있는 모든 경우의 수(8가지, moves)를 하나씩 대입한 후,
영역 밖을 벗어났을 경우를 제외하고 count 하여 출력했습니다.
감사합니다.
'Coding Test > 구현' 카테고리의 다른 글
[구현 알고리즘] 1989. 초심자의 회문 검사 (파이썬) (0) | 2023.04.17 |
---|---|
[구현 알고리즘] 2001. 파리 퇴치 (파이썬) (0) | 2023.04.17 |
[구현 알고리즘] 2005. 파스칼의 삼각형 (파이썬) (0) | 2023.04.17 |
[구현 알고리즘] 2007. 패턴 마디의 길이 (파이썬) (0) | 2023.04.17 |
[구현 알고리즘] 1926. 간단한 369게임 (파이썬) (0) | 2023.04.17 |