꿈꾸는 개발자의 devLog
[BaekJoon] "구현" - 백준 4396번 문제 : 지뢰 찾기 본문
반응형
[문제 설명]
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='')
반응형
'Algorithm > BaekJoon' 카테고리의 다른 글
[BaekJoon] "완전탐색" - 백준 15721번 문제 : 번데기 (0) | 2023.12.20 |
---|---|
[BaekJoon] "백트래킹" - 백준 1182번 문제 : 부분수열의 합 (0) | 2023.12.20 |
[BaekJoon] "그리디" - 백준 20115번 문제 : 에너지 드링크 (0) | 2023.12.20 |
[BaekJoon] "DP" - 백준 1912번 문제 : 연속합 (0) | 2023.12.18 |
[BaekJoon] "DP" - 백준 2407번 문제 : 조합 (2) | 2023.12.08 |
Comments