백준 4396번 지뢰 찾기 문제 풀이(Python, 구현, Silver 4)

전승재·2024년 2월 20일
0

알고리즘

목록 보기
77/88

백준 4396번 지뢰 찾기 문제 바로가기

문제 접근

다들 지뢰 찾기는 한번씩 해봤을것이다!
이 문제는 지뢰 찾기의 흐름을 그대로 가져가는 문제이다.
지금까지 열린 칸을 입력으로 주고 지뢰를 아직까지 밟지 않았다면 열린칸에 숫자를 출력하라고 하고 만약 지뢰를 밟았다면 열린칸에 숫자를 출력함과 동시에 지뢰의 위치를 모두 출력해야한다.
아래에서 3번째 사진과 같이 말이다.

따라서 나는 이 문제를 2가지 부분으로 나누어 풀었다.

  • 주위 8방향에 지뢰의 개수를 찾아 열린 칸에 넣기
  • 모든 지뢰의 위치를 출력에 넣기

이미 열린칸에 대해서 주위 8방향에 지뢰의 개수를 찾는 함수를 실행하고 그 칸에 개수를 넣어주면 된다.
만약 지뢰를 밟지 않았다면 그대로 출력하면 되고 지뢰를 밟았다면 결과에 지뢰의 위치를 덮어씌어서 출력하면 된다!

문제 풀이

주위 8방향에 지뢰의 개수를 찾아 열린 칸에 넣기

dx = [0,0,-1,1,1,1,-1,-1]
dy = [1,-1,0,0,-1,1,1,-1]

def find_mine_count(x,y): # 주위 8방향에 지뢰의 개수 찾기
    count = 0
    for i in range(8):
        nx = x+dx[i]
        ny = y+dy[i]
        if nx<0 or ny<0 or nx>=N or ny>=N:
            continue

        if pan[nx][ny]=='*': # 지뢰가 있다면
            count += 1
    return count

모든 지뢰의 위치를 출력에 넣기

def game_over(): # 지뢰 밟았을 때 시행되는 함수
    for i in range(N):
        for j in range(N):
            if pan[i][j]=='*':
                open[i][j] = '*

이 함수들을 유기적으로 연결할 main

for i in range(N):
    for j in range(N):
        if open[i][j]=='x':#열린칸이라면
            open[i][j] = find_mine_count(i,j) #주위 8방향에 지뢰의 개수가 들어가야한다.
            if pan[i][j]=='*': #근데 만약에 열린칸이 지뢰였다면
                game_over() #지뢰 밟은고임!!!

제출 코드

import sys
N = int(sys.stdin.readline())
dx = [0,0,-1,1,1,1,-1,-1]
dy = [1,-1,0,0,-1,1,1,-1]

def find_mine_count(x,y): # 주위 8방향에 지뢰의 개수 찾기
    count = 0
    for i in range(8):
        nx = x+dx[i]
        ny = y+dy[i]
        if nx<0 or ny<0 or nx>=N or ny>=N:
            continue

        if pan[nx][ny]=='*':
            count += 1
    return count

def game_over(): # 지뢰 밟았을 때 시행되는 함수
    for i in range(N):
        for j in range(N):
            if pan[i][j]=='*':
                open[i][j] = '*'
       
pan = [] #지뢰 위치담을 배열
open = [] #열린칸 위치담을 배열
 
for i in range(N): # 입력값 받기
    line = list(map(str, sys.stdin.readline().strip()))
    pan.append(line)
for i in range(N):
    line = list(map(str, sys.stdin.readline().strip()))
    open.append(line)

for i in range(N):
    for j in range(N):
        if open[i][j]=='x':#열린칸이라면
            open[i][j] = find_mine_count(i,j) #주위 8방향에 지뢰의 개수가 들어가야한다.
            if pan[i][j]=='*': #근데 만약에 열린칸이 지뢰였다면
                game_over() #지뢰 밟은고임
               

for l in open: #출력
    for i in l:
        print(i,end='')
    print()

0개의 댓글