[COS PRO 1급] 3차 문제3) 비숍으로부터 도망쳐

아현·2023년 9월 11일
0

Algorithm

목록 보기
388/400

연습문제


비숍으로부터 도망쳐


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

8 x 8 크기의 체스판 위에 여러 개의 비숍(Bishop)이 놓여있습니다. 이때, 비숍(Bishop)들에게 한 번에 잡히지 않도록 새로운 말을 놓을 수 있는 빈칸의 개수를 구하려고 합니다.
위 그림에서 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 50개입니다.
8 x 8 체스판에 놓인 비숍의 위치 bishops와 bishops의 길이 bishops_len이 매개변수로 주어질 때, 비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸 개수를 return 하도록 solution 함수를 완성해주세요.

□ 매개변수 설명

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

□ return 값 설명

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




def solution(bishops):
	answer = 0
	dx = [-1, 1, -1, 1]
	dy = [-1, -1, 1, 1]
	
	check = []
	
	for bishop in bishops:
		
		if bishop not in check:
			check.append(bishop)

		for i in range(4):			
			x = bishop[0]
			y = bishop[1]
			
			while "A" <= x <= "H" and "1" <= y <= "8":
				x = chr(ord(x) + dx[i])
				y = chr(ord(y) + dy[i])
		
				if x + y not in check and "A" <= x <= "H" and "1" <= y <= "8":
					check.append(x + y)
			
	answer = 64 - len(check)
	
	return answer
    
profile
For the sake of someone who studies computer science

0개의 댓글