[SWEA] 1868. 파핑파핑 지뢰찾기(python)
📌문제
💪아이디어
주변 지뢰갯수 세기
지뢰가 아닌 ‘.’면 그 위치를 기준으로 8방향에 지뢰 개수를 센다.
주변의 지뢰 갯수가 0 이면 따로 리스트에 넣는다.주변에 지뢰가 없는 곳부터 클릭하기
1번에서 주변에 지뢰가 없는 곳을 따로 저장해놓았다. 지뢰가 0인부분부터 누르기 시작한다. 0은 연속적으로 주변 지뢰를 보여주기 때문에 0인 부분부터 누르면 최소 클릭수를 얻을 수 있다.
또 연속적으로 숫자가 보여지는 기능을 구현하기 위해서 주변 지뢰개수가 0이면 queue에 포함해준다.지뢰가 아닌 부분에서 최소클릭 수 뺴주기
지뢰가 아니고 주변 지뢰의 개수가 0이상인 곳은 연속적으로 숫자를 보여주지 않는다. 한 번씩 다 눌러줘야한다. 그래서전체 지뢰가 아닌 개수 - 2번에서 누른 클릭수
하면 최소 클릭수를 얻을 수 있다.
🥂코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from collections import deque
dir = (-1,0,1)
def chkBomb():
global left
zero = []
for y in range(N):
for x in range(N):
if board[y][x] == '*': continue
left += 1
cnt = 0
for i in range(3):
for j in range(3):
ny, nx = y +dir[i], x + dir[j]
if ny==y and nx==x: continue
if 0 <= ny < N and 0 <= nx < N and board[ny][nx]=='*':
cnt += 1
cntBoard[y][x] = cnt
if cnt==0: zero.append((y,x))
return zero
def click(y,x):
global left
queue = deque()
clicked[y][x] = True
queue.append((y,x))
left -= 1
while queue:
cury, curx = queue.popleft()
for i in range(3):
for j in range(3):
ny, nx = cury +dir[i], curx + dir[j]
if ny == cury and nx == curx: continue
if 0 <= ny < N and 0 <= nx < N and not clicked[ny][nx] and board[ny][nx]=='.':
clicked[ny][nx] = True
left -= 1
if cntBoard[ny][nx] == 0: queue.append((ny,nx))
T = int(input())
for tc in range(1,T+1):
N = int(input())
board = [list(input()) for _ in range(N)]
cntBoard = [['*' if board[i][j] == '*' else 0 for j in range(N)]for i in range(N)]
left = 0
zero = chkBomb()
clicked = [[False for _ in range(N)]for _ in range(N)]
answer = 0
for plot in zero:
y, x = plot
if not clicked[y][x]:
click(y,x)
answer += 1
answer += left
print("#{} {}".format(tc,answer))
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.