Post
지뢰 찾기(백준 4396번) | Gihun Son

지뢰 찾기(백준 4396번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가? ✓

  2. 1시간이내로 풀렸던 문제인가?

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?


난이도 체감

  1. 최상

  2. 중✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어가 진다. 지뢰가 없는 지점을 건드리면, 그곳의 상하좌우 혹은 대각선으로 인접한 8개의 칸에 지뢰가 몇 개 있는지 알려주는 0과 8 사이의 숫자가 나타난다. 완전히 플레이되지 않은 게임에서 일련의 동작이 아래에 나타나 있다.

https://www.acmicpc.net/upload/images3/Image1.gif

https://www.acmicpc.net/upload/images3/Image2.gif

https://www.acmicpc.net/upload/images3/Image3.gif

여기서, n은 8이고, m은 10이며, 빈 칸은 숫자 0을 의미하고, 올라가 있는 칸은 아직 플레이되지 않은 위치이며, 별표 모양(*)과 닮은 그림은 지뢰를 의미한다. 맨 왼쪽의 그림은 일부만이 플레이된 게임을 나타낸다. 첫 번째 그림에서 두 번째 그림으로 오면서, 플레이어는 두 번의 이동을 시행해서, 두 번 다 안전한 곳을 골랐다. 세 번째 그림을 볼 때 플레이어는 운이 썩 좋지는 않았다. 지뢰가 있는 곳을 골라서 게임에서 졌다. 플레이어는 m개의 열리지 않은 칸을 남길 때까지 계속해서 안전한 곳을 고르면 이긴다. 그 m개의 칸은 반드시 지뢰이다.

당신이 할 일은 일부가 플레이된 게임의 정보를 읽어 해당하는 격자를 출력하는 것이다.

Untitled

나의 풀이

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
import sys
input=sys.stdin.readline

n=int(input().strip())
closed_map=[]
open_map=[]
for _ in range(n):
    m1=list(input().strip())
    closed_map.append(m1)
for _ in range(n):
    m2=list(input().strip())
    open_map.append(m2)
answer=[[] for _ in range(n)]
bomb_check=0
for i in range(n):
    for j in range(n):
        if open_map[i][j]=='x':
            if closed_map[i][j]=='*':
                answer[i].append('*')
                bomb_check=1
                continue
            bomb_count=0
            for i2 in range(3):
                for j2 in range(3):
                    ch_x=i-1+i2
                    ch_y=j-1+j2
                    if 0<=ch_x<n and 0<=ch_y<n and closed_map[ch_x][ch_y]=='*':
                        bomb_count+=1
            answer[i].append(str(bomb_count))
        else:
            if closed_map[i][j]=='*':
                answer[i].append('*')
            else:
                answer[i].append('.')
if bomb_check==0:
    for i3 in range(n):
        for j3 in range(n):
            if answer[i3][j3]=='*':
                answer[i3][j3]='.'
for k in range(n):
    print(''.join(answer[k]))
    
  • ‘x’로 표시된 모든 곳에서 주변의 지뢰 ‘*’를 찾도록 코딩하였다.
  • 우선 answer에 지뢰인 곳은 모두 ‘’로 표시하고, ‘x’로 표시된 곳에 지뢰가 있다면 유지, 만약 없다면 ‘’를 모두 ‘.’으로 변환하여 문제를 해결하였다.
This post is licensed under CC BY 4.0 by the author.