새소식

반응형
Algotithms

[백준] 4096 지뢰찾기

  • -
728x90
반응형

문제

  • NxN 격자에 M개의 지뢰가 숨겨져 있다.
  • 격자판의 어느 지점을 선택했을 때 지뢰가 있으면 플레이어가 진다.
  • 지뢰가 없는 지점을 선택하면 인접한 8개의 칸에 지뢰가 몇 개 있는 지 0-8 사이의 숫자로 알려준다.
  • 일부가 플레이된 게임의 정보가 주어질 때, 해당하는 격자 출력하기
    • 온점(.)은 지뢰가 없는 지점, 별(*)은 지뢰가 있는 지점, 
    • 이미 열린 칸은 영소문자 x로, 열리지 않은 칸은 온점(.)으로 표시한다.
  • 만약 지뢰가 있는 칸이 열렸다면 지뢰있는 모든 칸이 별표(*)로 표시되고 다른 지점들은 온점(.)이어야 한다.

 

  • 1 <= N <= 10

 

풀이

  • 1) 지뢰가 터진 경우
    • 이미 열린 칸은 0-8 사이의 숫자로, 지뢰는 * 표시로, 나머지 칸은 온점(.)으로 표시한다.
  • 2) 지뢰가 터지지 않은 경우
    • 이미 열린 칸은 0-8 사이의 숫자로, 나머지 칸은 온점(.)으로 표시한다.

 

  • 지뢰가 있는 칸을 set에 기록해둔다.
  • 지뢰가 터졌는지 먼저 확인하고 mine_flag 의 값을 설정한다.
  • 격자판을 차례로 돌면서 지뢰가 터진 경우에는 *를, 아닌 경우에 오픈된 칸에는 0-8 숫자를, 오픈되지 않은 칸은 .을 추가한다.
# 지뢰가 터졌는지 확인하는 함수
def check_mine(graph, mine) :
    for i in range(N) :
        for j in range(N) :
            if graph[i][j] == 'x' and (i, j) in mine :
                return True
    return False

N = int(input())
# 지뢰 위치 기록
mine = set()
for i in range(N) :
    line = list(map(str, input()))
    for j in range(N) :
        if line[j] == '*' :
            mine.add((i, j))
# 현재 격자판 입력
graph = [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)

mine_flag = check_mine(graph, mine) # 지뢰가 터진 경우 True

for i in range(N) :
    line = ''
    for j in range(N) :
        if (i, j) in mine and mine_flag :
            line += '*'
        elif graph[i][j] == 'x' : # 오픈되었다면
            line += str(sum([1 if (i+dx[d], j+dy[d]) in mine else 0 for d in range(8)]))
        else :
            line += '.'
    print(line)

 

References

  • 백준 구현
반응형

'Algotithms' 카테고리의 다른 글

[백준] 2224 명제 증명  (0) 2023.10.26
[백준] 16234 인구이동  (0) 2023.10.24
[백준] 2056 작업  (1) 2023.10.23
[백준] 20365 블로그2  (1) 2023.10.23
[백준] 11066 파일 합치기  (0) 2023.10.20
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.