반응형
◎ 문제
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
a 부터 h로 표현한다
- c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
- a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다
- 입력조건
첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.
- 출력조건
첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
- 입력 예시
a1
- 출력 예시
2
◎ 문제풀이
왕실나이트가 이동가능한 경우의 수를 출력하는 문제이다. 가능한 경우를 검증하는 로직이 중요하다.
수평이동은 a와 h 사이이고
수직이동은 1과 8 사이이다.
이동가능여부 검증을 단순화하려면 a~h를 1~8로 바꾸어야 한다. 알파벳은 ord함수를 사용하면 유니코드 숫자가 된다. 입력받은 열을 x라고 한다면 x = ord(x) - ord('a') + 1 로 연산해하면 a~h는 1<= x <= 8로 검증할 수 있다.
◎ 코드
#검증함수
def isvalidate(direct) :
dx,dy = direct
if x+dx >= 1 and x+dx <= 8 and y+dy >= 1 and y+dy <= 8 : return True
else : False
n = input()
x, y = ord(n[0]), int(n[1])
x = x - ord('a') + 1 # 검증대상 일원화하기
direction = [[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[-1,2],[-1,-2],[1,-2]] # 이동가능한 경우의 수 (8가지)
result = 0
for direct in direction :
if isvalidate(direct) : result += 1
print(result)
- 입력
a1
- 출력
2
참고자료
반응형
'문제풀이 > Implementation' 카테고리의 다른 글
[PS] BOJ18111 마인크래프트 ( 구현 ) with JAVA (0) | 2024.01.16 |
---|---|
[PS] Programmers - k진수에서 소수 개수 구하기 (1) | 2024.01.15 |
[PS] Programmers - 신고 결과 받기 with JAVA (0) | 2024.01.15 |
[PS] BOJ20055 컨베이어 벨트 위의 로봇 ( inplementation ) with JAVA (1) | 2023.10.26 |
[CodingTest] 게임 개발 ( 구현 ) (0) | 2023.05.26 |