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

[COS PRO 1급 #3-3] 비숍으로부터 도망쳐

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

문제설명

체스에서 비숍(Bishop)은 아래 그림과 같이 대각선 방향으로 몇 칸이든 한 번에 이동할 수 있습니다. 만약, 한 번에 이동 가능한 칸에 체스 말이 놓여있다면 그 체스 말을 잡을 수 있습니다.

 

8 x 8 크기의 체스판 위에 여러 개의 비숍(Bishop)이 놓여있습니다. 이때, 비숍(Bishop)들에게 _**한 번에**_ 잡히지 않도록 새로운 말을 놓을 수 있는 빈칸의 개수를 구하려고 합니다.

위 그림에서 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 50개입니다.

8 x 8 체스판에 놓인 비숍의 위치 bishops가 매개변수로 주어질 때, 비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸 개수를 return 하도록 solution 함수를 완성해주세요.

매개변수 설명

체스판에 놓인 비숍의 위치 bishops가 solution 함수의 매개변수로 주어집니다.
* bishops는 비숍의 위치가 문자열 형태로 들어있는 리스트입니다.
* bishops의 길이는 1 이상 64 이하입니다.
* 비숍이 놓인 위치는 알파벳 대문자와 숫자로 표기합니다.
  * 알파벳 대문자는 가로 방향, 숫자는 세로 방향 좌표를 나타냅니다.
  * 예를 들어 위 그림에서 비숍이 있는 칸은 "D5"라고 표현합니다.
* 한 칸에 여러 비숍이 놓이거나, 잘못된 위치가 주어지는 경우는 없습니다.

return 값 설명

비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸의 개수를 return 해주세요.

예시

| bishops            | return |
|--------------------|--------|
| ["D5"]             | 50     |
| ["D5", "E8", "G2"] | 42     |

예시 설명

예시 #1
문제에 나온 예시와 같습니다.

예시 #2

그림과 같이 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 42개입니다.

문제 코드

#다음과 같이 import를 사용할 수 있습니다.
#import math

def solution(bishops):
    #여기에 코드를 작성해주세요.
    answer = 0
    return answer

풀이

def solution(bishops):
	# 비숍이 이동할 수 있는 칸의 리스트 check
	check = []
	for bishop in bishops:
		# bishop이 check에 없으면 check에 추가
		if bishop not in check:
			check.append(bishop)
            
		for i in range(4):
			x = bishop[0]
			y = bishop[1]
			dx = [1, 1, -1, -1]
			dy = [1, -1, 1, -1]
            
			# 비숍을 체스판에서 이동
			while "A" <= x <= "H" and "1" <= y <= "8":
				x = chr(ord(x)+dx[i])
				y = chr(ord(y)+dy[i])
                
				# 비숍이 이동한 위차가 check에 없고, 체스판 위에 있으면 check에 추가
				if x+y not in check and "A" <= x <= "H" and "1" <= y <= "8":
					check.append(x+y)
                    
	# 비숍이 이동할 수 없는 칸의 개수 구하기
	answer = 64 - len(check)
    
	return answer

댓글