https://www.acmicpc.net/problem/1986
import sys
input = sys.stdin.readline
N, M = map(int, input().split(" "))
queenS = list(map(int, input().split(" ")))
knightS = list(map(int, input().split(" ")))
pawnS = list(map(int, input().split(" ")))
queen, knight, pawn = [], [], []
visited = [[0]*M for _ in range(N)]
# 퀸 좌표 저장
for i in range(queenS[0]):
x = queenS[1 + 2 * i]
y = queenS[1 + 2 * i + 1]
queen.append((x-1, y-1))
visited[x-1][y-1] = 1
# 나이트 좌표 저장
for i in range(knightS[0]):
x = knightS[1 + 2 * i]
y = knightS[1 + 2 * i + 1]
knight.append((x-1, y-1))
visited[x-1][y-1] = 1
# 폰 좌표 저장
for i in range(pawnS[0]):
x = pawnS[1 + 2 * i]
y = pawnS[1 + 2 * i + 1]
pawn.append((x-1, y-1))
visited[x-1][y-1] = 1
# 퀸의 8방향 이동: 상, 하, 좌, 우, 좌상, 우상, 좌하, 우하
directions = [
(-1, 0), (1, 0), # 상, 하
(0, -1), (0, 1), # 좌, 우
(-1, -1), (-1, 1), # 좌상, 우상
(1, -1), (1, 1) # 좌하, 우하
]
# 퀸 움직이면서 공격 가능한 칸을 visited에 표시
for qx, qy in queen:
for dx, dy in directions:
x, y = qx, qy
while True:
x += dx
y += dy
# 범위 벗어나면 종료
if not (0 <= x < N and 0 <= y < M):
break
# 다른 말이 있는 칸이면 종료
if visited[x][y] == 1:
break
# 공격 가능한 칸으로 표시
if visited[x][y] == 0:
visited[x][y] = 2
# 나이트 이동 경우의 수
directions = [
(2, 1), (2, -1),
(-2, -1), (-2, 1),
(1, 2), (1, -2),
(-1, 2), (-1, -2)
]
# 나이트 움직이면서 공격 가능한 칸을 visited에 표시
for qx, qy in knight:
for dx, dy in directions:
x, y = qx, qy
x += dx
y += dy
# 범위 벗어나면 종료
if not (0 <= x < N and 0 <= y < M):
continue
# 다른 말이 있는 칸이면 종료
if visited[x][y] == 1:
continue
# 공격 가능한 칸으로 표시
if visited[x][y] == 0:
visited[x][y] = 2
dap = 0
for i in visited:
for j in i:
if j == 0:
dap += 1
print(dap)'코딩테스트 > 코딩테스트 문제풀이' 카테고리의 다른 글
| [Python] 백준 <7576-토마토> (0) | 2025.06.26 |
|---|---|
| [Python] 백준 <14502-연구소> (0) | 2025.06.25 |
| [Python] 백준 <1309-동물원> (0) | 2025.06.22 |
| [Python] 백준 <4889-안정적인 문자열> (0) | 2025.06.21 |
| [Python] 백준 <2792-보석 상자> (0) | 2025.06.21 |