현제의 현재이야기

[백준/python] 16918 - 봄버맨 본문

algorithm

[백준/python] 16918 - 봄버맨

현재의 현제 2022. 6. 25. 15:31

import sys
input = sys.stdin.readline

def bomb(map, R, C):
    for i in range(R):
        for j in range(C):
            if map[i][j] == '.':
                map[i][j] = 'O'
            elif map[i][j] == 'O':
                map[i][j] = '1'
                if j > 0:
                    map[i][j - 1] = '1'
                if j < C - 1 and map[i][j + 1] != 'O':
                    map[i][j + 1] = '1'
                if i > 0:
                    map[i - 1][j] = '1'
                if i < R - 1 and map[i + 1][j] != 'O':
                    map[i + 1][j] = '1'
    for i in range(R):
        for j in range(C):
            if map[i][j] == '1':
                map[i][j] = '.'
    return map 

def allbomb(map, R, C):
    for i in range(R):
        for j in range(C):
            map[i][j] = 'O'
    return map

def printmap(map, R, C):
    for i in range(R):
        for j in range(C):
            print(map[i][j], end='')
        print()

R, C, N = map(int, input().split())

map = [
    list(input().rstrip())
    for _ in range(R)
]


if N == 1:
    printmap(map, R, C)
elif N % 2 == 0: #짝수번째는 다 폭탄
    map = allbomb(map, R, C)
    printmap(map, R, C)
elif N % 4 == 3: #첫번째 폭발
    map = bomb(map, R, C)
    printmap(map, R, C)
elif N % 4 == 1: #두번째 폭발
    map = bomb(map, R, C)
    map = bomb(map, R, C)
    printmap(map, R, C)

진짜 몇 시간 동안 17퍼에서 계속 틀렸습니다 뜨길래 열받다가 마지막 map = bomb(map,r ,c) 추가하고 해결

5 9 13 17 … 초는 초기 폭탄 배치와 다르다!!

| 알고리즘

  1. 우선 4가지 경우로 나누어야 한다. 1초 후, 짝수, 3 7 11 15초,, 하고 5 9 13 17초… 이렇게 나누어진다.
  2. 짝수 번째는 받은 거 싹다 0으로
  3. 3 7. 11 15초는 첫번째 폭발. 탐색하다가 .을 만나면 0으로 바꾸고 만약 0을 만나면 1로 바꾸고 주변도 1로 바꾼다. 그러나 앞으로 탐색하는 좌표도 1로 바꾸어 버린다면 앞선 if문을 실행시키지 못하기에 탐색한 왼쪽과 위쪽만 1로 바꾸어준다.
  4. 1로 바꾸어주면 밑의 이중 포문에서 1을 . 으로 바꾸어줌
  5. 그래서 n이 1이면 그냥 아무것도 안하기 때문에 초기 폭탄 배치상태, n이 짝수면 다 폭탄 설치, 나머지가 3이면(ex. 3초) 첫번째 폭발이고 그 후 나머지가 1은(ex.5초) 3초 폭발 상태에서 한번 더 폭탄 설치를 해준 것.

틀렸던 이유: 마지막을 계속 초기화면으로 printmap(map, R, C) 만 해주었었는데 알고보니깐 나중에 예외가 있다더라. 그래서 문제대로 한 번 터뜨리고 그것을 한 번 더 터뜨리도록 map = bomb(map, R, C) map = bomb(map, R, C) 을 해주었다.

Comments