[백준] 16918. 봄버맨(python, 파이썬)

giggle·2023년 5월 11일
0

문제

16918. 봄버맨


📌 아이디어

초기 풀이에서는 시간에 따라 폭탄의 움직임을 모두 구하고 2차원 배열에 저장하는 방식으로 진행하였지만, 결국 시간 초과로 문제를 해결하지 못했습니다. 그 후 시간에 따른 폭탄의 패턴을 발견하였고, 시간을 따로 계산해 해당 패턴에 대한 2차원 배열을 출력하도록 했습니다.

  1. N = 1인 경우는 초기 모양을 반환합니다.
  2. N이 짝수인 경우는 폭탄이 격자판에 항상 가득 찹니다.
  3. N % 4 = 3인 경우(ex 3, 7, 11...)는 예시 2의 격자판에서 초기 폭탄 위치에서 폭발 시킨 상태입니다.
  4. N % 4 = 1인 경우(ex 5, 9, 13...)는 예시 3의 격자판에 있는 폭탄 위치에서 폭발 시킨 상태입니다.

위와 같은 4가지 조건을 만족하도록 코드를 작성하여 문제를 해결했습니다.

📌 코드

'''
폭탄 폭발시 인접한 4칸 동시 폭발
'''
R, C, N = map(int, input().split())

arr = [list(input()) for _ in range(R)]
all = [['O'] * C for _ in range(R)]

if N <= 1: # 1
    for lst in arr:
        lst = ''.join(lst)
        print(lst)

elif N % 2 == 0: # 2, 4, 6, 8
    for lst in all:
        lst = ''.join(lst)
        print(lst)
else:
    bomb1 = [lst[:] for lst in all]

    for i in range(R):
        for j in range(C):
            if arr[i][j] == 'O':
                bomb1[i][j] = '.'
                for di, dj in ((1, 0), (0, 1), (-1, 0), (0, -1)):
                    ni, nj = i + di, j + dj
                    if 0 <= ni < R and 0 <= nj < C:
                        bomb1[ni][nj] = '.'

    bomb2 = [lst[:] for lst in all]

    for i in range(R):
        for j in range(C):
            if bomb1[i][j] == 'O':
                bomb2[i][j] = '.'
                for di, dj in ((1, 0), (0, 1), (-1, 0), (0, -1)):
                    ni, nj = i + di, j + dj
                    if 0 <= ni < R and 0 <= nj < C:
                        bomb2[ni][nj] = '.'

    if N % 4 == 1: # 5, 9, 13
        for lst in bomb2:
            lst = ''.join(lst)
            print(lst)

    else: # 3, 7, 11, 15
        for lst in bomb1:
            lst = ''.join(lst)
            print(lst)




피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글