문제3
체스에서 비숍(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"] ["D5", "E8", "G2"] |
50 42 |
Python
def toInt(piece):#ASCII~A=65
return ord(piece[0])-(65-1), int(piece[1])
def move(bishop):
coord = set()
x,y = toInt(bishop)
bUp, bDown = y-x, y+x
#y=x+b -> b=y-x
#y=-x+b -> b=y+x
for i in range(1,9):
if not( bUp+i > 8 or bDown-i > 8):
coord.add( (i, bUp+i) )
coord.add( (i, bDown-i) )
return coord
def solution(bishops):
coord = set([ toInt(b) for b in bishops ])
for bishop in bishops:
coord |= move(bishop) #union 합집합
return 64-len(coord)
print(solution(["D5"]))
print(solution(["D5","E8","G2"]))
+)
'Algorithm Problems' 카테고리의 다른 글
[Cos Pro 2급] 4차 1번 - 사다리타기 (0) | 2021.02.06 |
---|---|
에라토스테네스의 체 - pygame으로 설명 (0) | 2021.02.04 |
[Cos Pro 1급] 1차 5번 - 소용돌이 수의 대각선의 합 (0) | 2021.02.02 |
[Cos Pro 1급] [백준] 1차 2번, 3449번 - 해밍거리 (0) | 2021.01.28 |
[Cos Pro 1급] 3차 5번 - 전광판 어플 (0) | 2021.01.24 |