코딩테스트 연습

[Python] 이코테 2021 <구현> 왕실의 나이트

환타몬 2022. 2. 26. 17:55

<구현> 왕실의 나이트

 

행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면입니다. 왕실 정원의 특정한 한 칸에 나이트가 서 있습니다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마합니다.

 

나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없습니다.

 

나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있습니다.

  • 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  • 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

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

  • c2에 있을 때 이동할 수 있는 경우의 수는 6가지입니다.

 

My A :

#아이디어 : 이동할 경우의 수를 배열에 담고 이동할 수 있으면 카운트 세기
#처음에 숫자로 하는 것이 마음이 편함. 나중에 col, low에 알맞는 인덱스 대입
def sol(position):
    count = 8
    #움직이는 패턴. 인덱스는 각각 01, 23, 45 ... ,1415
    move = [2,1, 1,2, -1,2, -2,1, 1,-2, -2,1, -2,-1, -1,-2]
    row = ['1', '2', '3', '4', '5', '6', '7', '8']
    col = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    # x, y로 col, low에 맞는 인덱스 삽입
    x = position[:1]
    y = position[-1]
    for i in col:
        if x in col:
            x = col.index(x)

    for j in row:
        if y in row:
            y = row.index(y)

    # 말이 이동할 수 없는 경우 count 감산 연산
    for k in range(0,len(move)-1,2):
        nx = x + move[k]
        ny = y + move[k+1]
        if ny <= -1 or nx <= -1 or nx > 7 or ny > 7:
            count -= 1
        # 체크 후 nx, ny 초기화
        nx = 0
        ny = 0
    print(count)
    return count

sol('h8')

 => 2 출력 

 

 


Other A :

#현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1 

# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2,-1), (-1,-2), (1,-2), (2,-1), (2,1), (1,2), (-1,2), (-2,1)]

# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
result = 0
for step in steps :
    #이동하고자 하는 위치 확인
    next_row = row+step[0]
    next_column = column + step[1]
    
    #해당 위치로 이동이 가능하다면 카운트 증가
    if next_row >= 1 and next_row<=8 and next_column >= 1 and next_column <=8:
        result += 1
        
print(result)