[구현] 왕실의 나이트

merong·2023년 2월 17일
0

이코테

목록 보기
7/17
post-thumbnail

<이것이 취업을 위한 코딩 테스트다>를 공부하며 정리한 내용입니다.

문제

❓ 행복 왕국의 왕실 정원은 체스판과 같은 8x8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다. 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다. 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

이처럼 8x8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오. 이때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현한다.

입력 조건

  • 첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.

출력 조건

  • 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

입력 예시

a1

출력 예시

2


해설

  1. 내 풀이
    • 열 위치를 숫자로 변환하기 위해서 미리 딕셔너리로 정의해 둠.
    • 8가지 방향을 행, 열 별로 리스트에 저장해 둠.
    • 영역을 탈출했는지를 체크
cr=input() #좌표 입력
    
ato1={'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8} #열 위치 숫자로 변환
    
r,c=int(cr[1]), ato1[cr[0]] #행, 열 위치 각자 정수로 표현
    
#행 열 방향으로 이동하는 8가지 조합들
dr=[2,2,-2,-2,1,1,-1,-1] 
dc=[1,-1,1,-1,2,-2,2,-2]
    
cnt=0 #경우의 수
    
#8가지 조합 중 가능한 조합 찾기
for i in range(8):
    nr=r+dr[i] #그 조합으로 이동해 본다
    nc=c+dc[i]
    
    if nr<1 or nr>8 or nc<1 or nc>8: #영역을 탈출하면
        continue #카운트 x
    
        cnt+=1 #이동가능하면 카운트
    
    print(cnt) #경우의 수 출
  1. 교재 풀이
    • 열 위치를 숫자로 변환하기 위해서 아스키 코드값 이용하여 연산
    • 8가지 방향을 하나의 리스트에 저장해둠.
    • 영역 안에 있는지를 체크
cr=input()
r=int(cr[1])
c=ord(cr[0])-ord('a')+1 #ord 함수는 아스키 코드값을 반환해줌.
    
#나이트가 이동할 수 있는 8가지 방향 정의
steps=[(-2,-1),(-1,-2),(1,-2),(2,-1),(2,1),(1,2),(-1,2),(-2,1)]
    
cnt=0
    
for step in steps:
    nr=r+step[0]
    nc=c+step[1]
    
    if nr>=1 and nr<=8 and nc>=1 and nc<=8:
        cnt+=1
    
print(cnt)

P.S 상하좌우 문제와 비슷한 풀이다. 먼저 움직일 수 있는 선택지를 정의하고, 그 선택지로 가면 어떻게 되는지를 계산하고 조건을 따져준다.

profile
매일매일이 새로운 시작점

0개의 댓글