반응형
Recent Posts
Recent Comments
«   2025/05   »
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
Today
Total
관리 메뉴

꿈꾸는 개발자의 devLog

[BaekJoon] "구현" - 백준 4396번 문제 : 지뢰 찾기 본문

Algorithm/BaekJoon

[BaekJoon] "구현" - 백준 4396번 문제 : 지뢰 찾기

덩화 2023. 12. 20. 10:16
반응형

[문제 설명]

https://www.acmicpc.net/problem/4396

 

4396번: 지뢰 찾기

첫 번째 줄에는 10보다 작거나 같은 양의 정수 n이 입력된다. 다음 n개의 줄은 지뢰의 위치를 나타낸다. 각각의 줄은 n개의 문자를 사용하여 한 행을 나타낸다. 온점(.)은 지뢰가 없는 지점이며 별

www.acmicpc.net

일반적으로 컴퓨터에서 지뢰게임 했을 때 띄워주는 화면을 구현하는 것임

자잘한 설명은 적지 않겠음

 

[해결 로직]

일단 상하좌우, 그리고 각 네 방향의 대각선해서 총 8개의 방향으로 움직일 수 있도록 방향 리스트를 사용하였음

그리고 여기서 알아야 하는게 지뢰가 한번이라도 눌러졌다면, 지뢰가 있는 모든 칸에 지뢰를 표시해야 함

8 방향 탐색시, 만약 폭탄이 있다면 폭탄 수 카운트 

로직은 간단히, 우리가 지뢰찾기 게임 했을 때의 로직을 생각하면 됨

처음에는 지뢰가 한번이라도 눌러졌을 때, 지뢰를 다 출력한다는 것을 생각 못했었음..

 

[Solution 코드]

from collections import deque

n = int(input())
bomb_lst = [list(map(str, input())) for _ in range(n)] ## 폭탄 입력
cur_loc = [list(map(str, input())) for _ in range(n)] ## 지뢰찾기 게임에서 누른거 위치 기록용

## 상하 좌우, 대각선 옮기기
dx = [-1, 1, 0, 0, -1, -1, 1, 1]
dy = [0, 0, -1, 1, -1, 1, -1, 1]
bombloc = [] ## 폭탄 위치 기록용
for i in range(n):
    for j in range(n):
        if bomb_lst[i][j] == '*':
            bombloc.append((i, j)) ## 추후에 지뢰가 열렸을 때, 모든 지뢰를 표시해야하므로 .. 이를 위한 지뢰위치 기록용

visited = [[False for _ in range(n)] for _ in range(n)]

bombq = deque()
x, y = 0, 0
bombq.append((x, y))
bmbmaps = [['.' for _ in range(n)] for _ in range(n)]
chkbmb = 0 ## 지뢰가 한번이라도 눌러졌는지 체크
## 만약 지뢰를 눌렀다면, 지뢰가 있는 모든 칸에서 지뢰를 보여줘야 함

while bombq:

    nx, ny = bombq.popleft()
    visited[nx][ny] = True
    bmbcnt = 0

    if (bomb_lst[nx][ny] == '*') & (cur_loc[nx][ny] == 'x'):
        ## 현재 열린자리에 폭탄이 있는거라면?
        chkbmb = 1
        bmbmaps[nx][ny] = '*'


    for i in range(len(dx)): ## 8방향 탐색
        cx = nx + dx[i]
        cy = ny + dy[i]


        if cx < 0 or cx >= n or cy < 0 or cy >= n: ## 다음 이동 방향이 범위 넘으면 탐색 금지
            continue

        if (visited[cx][cy] == True) & (bomb_lst[cx][cy] == '*'): ## 만약 범위 탐색 중 이미 갔던곳인데, 폭탄이 있다면
            ## 그냥 폭탄 수 카운트 
            bmbcnt += 1
            continue

        if visited[cx][cy] == False: ## 만약 간곳이 아니라면

            ## 다음 자리에 만약에 폭탄이 있다면?
            if (bomb_lst[cx][cy] == '*'): ## 간곳이 아닌데 폭탄이 있다. 그럼 이때도 폭탄 수 카운트
                bmbcnt += 1
            ## 어쨌든 간곳은 방문 표시해주고, 큐에 넣어줌
            visited[cx][cy] = True
            bombq.append((cx, cy))

    if cur_loc[nx][ny] == 'x':# 열었는데
        if (bomb_lst[nx][ny] == '.'): # 폭탄이 아닌경우에는
            bmbmaps[nx][ny] = bmbcnt # 숫자 삽입

if chkbmb == 1: ## 지뢰가 한번이라도 눌러졌다는 거임
    for i in range(len(bombloc)):
        bx, by = bombloc[i][0], bombloc[i][1]
        bmbmaps[bx][by] = '*'

for i in range(n):
    for j in range(n):
        if j == n - 1:
            print(bmbmaps[i][j])
        else:
            print(bmbmaps[i][j], end='')
반응형
Comments