알고리즘(백준)/구현

[알고리즘/구현] 4396번 : 지뢰 찾기 - python

되다 2023. 3. 20. 18:39

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

 

4396번: 지뢰 찾기

지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어

www.acmicpc.net


  • 문제
  • 소요시간: 30분 실패

 


  • 설계하기(접근방법) 

1. n, mine_list, check_list 을 입력받는다

2. 한 점 내에서 움직일 8방향의 좌표리스트를 생성한다

0 0 0

0 *  0  이것을 리스트로 표현하면  (0,0)을 제외한

0 0 0

 

dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1] 으로 표현된다

 

3. mine_list를 순회하며 8방위에 있는 지뢰의 개수만큼 숫자를 더해준다.

but 제약조건, 리스트의 끝 부의 경우 8방위를 순회하면 범위를 벗어나면서 에러가 발생하기 때문에 이를 조건화한다.

if 0 <= i + dx[k] < n and 0 <= j + dy[k] < n and mine_list[i+dx[k]][j+dy[k]] == '*'

즉 i에 x좌표를 더한 값이 0 ~ n 사이 and 즉 j에 y좌표를 더한 값이 0 ~ n 사이, 그리고 그 값이 '*'(지뢰) 인 경우 +1을 해준다

 

4. 지뢰가 발견되었을 시

flag = False를 선언하고, check_list의 'x'을 순회했을 때 , 그 좌표가 mine_list의  '*'(지뢰)와 일치한다면

flag = True가 된다. 

그 후 마지막에 check_list에 mine_list의 지뢰의 위치를 모두 표시해준다

 

5. join() 메서드를 통해 문자열을 한줄씩 출력해준다.


  • 코드(출력)
import sys
input = sys.stdin.readline

n = int(input())

mine_list = [list(input().rstrip()) for _ in range(n)]  # ...**..*
check_list = [list(input().rstrip()) for _ in range(n)]  # xxx.....

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

flag = False

for i in range(n):
    for j in range(n):
        if check_list[i][j] == 'x':
            if mine_list[i][j] == '*':
                flag = True
                continue
            cnt = 0
            for k in range(8):
                if 0 <= i + dx[k] < n and 0 <= j + dy[k] < n and mine_list[i+dx[k]][j+dy[k]] == '*':
                    cnt += 1
            check_list[i][j] = str(cnt)

if flag:
    for i in range(n):
        for j in range(n):
            if mine_list[i][j] == '*':
                check_list[i][j] = '*'

for i in check_list:
    print(''.join(i))

  • 얻어갈 부분

1. 문제 구현에 좌표를 이용해야 할 경우, 좌표 리스트를 따로 설정하여 순회하면 구현하기 쉽다

2. 문제 중간에 확인해야 하는 사항이 있는 경우, flag = False를 통해 손쉽게 제어할 수 있다