체스에서 비숍(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