본문 바로가기
Python/알고리즘

[COS PRO 1급 #1-6] 체스의 나이트

by 포푸리 (POPOOLY) 2023. 2. 13.
반응형

문제설명

체스에서 나이트(knight)는 아래 그림과 같이 동그라미로 표시된 8개의 방향중 한 곳으로 한 번에 이동이 가능합니다.

 

단, 나이트는 체스판 밖으로는 이동할 수 없습니다.

체스판의 각 칸의 위치는 다음과 같이 표기합니다.

 

예를 들어, A번줄과 1번줄이 겹치는 부분은 'A1'이라고 합니다.

나이트의 위치 pos가 매개변수로 주어질 때, 나이트를 한 번 움직여서 이동할 수 있는 칸은 몇개인지 return 하도록 solution 함수를 완성해주세요.

매개변수 설명

나이트의 위치 pos가 solution 함수의 매개변수로 주어집니다.
* pos는 A부터 H까지의 대문자 알파벳 하나와 1 이상 8이하의 정수 하나로 이루어진 두 글자 문자열입니다.
* 잘못된 위치가 주어지는 경우는 없습니다.

return 값 설명

나이트를 한 번 움직여서 이동할 수 있는 칸의 개수를 return 해주세요.

예시

| pos  | return |
|------|--------|
| "A7" | 3      |

예시 설명

나이트가 A7 위치에 있으면 아래 그림과 같이 왼쪽으로는 이동하지 못하고, 오른쪽으로는 맨 위를 제외한 나머지 세 칸으로 이동 가능합니다. 

 

따라서, 3을 return 하면 됩니다.

문제 코드

def solution(pos):
    # Write code here.
    answer = 0
    return answer

풀이 1

def solution(pos):
	answer = 0
	dx = [1, 1, 2, 2, -1, -1, -2, -2]
	dy = [2, -2, 1, -1, 2, -2, 1, -1]
	x_trans = {
		"A": 1,
		"B": 2,
		"C": 3,
		"D": 4,
		"E": 5,
		"F": 6,
		"G": 7,
		"H": 8
	}
	x = x_trans[pos[0]]
	y = int(pos[1])
    
    # 나이트를 이동한 값이 체스판 위에 있으면 answer += 1
	for i in range(8):
		if 0 < x+dx[i] < 9 and 0 < y+dy[i] < 9:

			answer += 1

	return answer

풀이 2

def solution(pos):
    dx = [1,1,-1,-1,2,2,-2,-2]
    dy = [2,-2,-2,2,1,-1,-1,1]
    
    # 아스키코드를 활용해 현재 x, y 좌표 구하기
    # 아스키코드: https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
    cx = ord(pos[0]) - ord("A")
    cy = ord(pos[1]) - ord("0") - 1
    ans = 0
    for i in range(8):
        nx = cx + dx[i]
        ny = cy + dy[i]
        if nx >= 0 and nx < 8 and ny >= 0 and ny < 8:
            ans += 1
    return ans

댓글