ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_16918_봄버맨 (python)
    Algorithm/백준_생각정리 2023. 7. 30. 14:30

    ★ 접근

     r,c,n의 크기가 최대 200이기 때문에 bfs로 풀까 생각했지만 폭탄이 동시에 깔리고 동시에 터지는 문제는 bfs로는 풀기 힘든 상황들이 자주 발생해서 쌩 구현을 해도 된다고 생각하고 접근  

    ★ 풀이

    n이 1초 => 초기 상태 출력

    n이 짝수 => 모든 칸이 폭탄

    그 외 = > 0초 폭탄, 1초 폭탄, 2초 폭탄을 나누어서

    2초를 터트리고 0초를 1초로 만들고 => 다음 1초동안 모든칸 포탄 채우고 1초 => 2초 폭탄 0초 폭탄 생성
    위 구문을 n-2초 동안 반복

    ★ 코드

    import sys
    input = sys.stdin.readline
    r,c,n, = map(int,input().split())
    graph = [list(input().rstrip()) for _ in range(r)]
    isgraph = set([(i,j) for i in range(r) for j in range(c)])
    if n == 1:
        for lis in graph:
            print(''.join(lis))
    else:
        if n % 2 == 0:
            for i in range(r):
                print('O'*c)
        else:
            zero = set()
            one = set()
            two = set()
            temp = set()
            dx = [-1,1,0,0]
            dy = [0,0,-1,1]    
            for i in range(r):
                for j in range(c):
                    if graph[i][j] == '.':
                        zero.add((i,j))
                    else:
                        two.add((i,j))    
            for i in range(n-2): # n이 2초면 아에 이 반복에 안 들어갈 것이고 n이 3초면 한 번 반복 ok
                if i % 2 == 0:
                    temp = set()
                    for x,y in two:
                        temp.add((x,y))
                        for k in range(4):
                            nx = x + dx[k]
                            ny = y + dy[k]
                            if 0 <= nx < r and 0 <= ny < c:
                                temp.add((nx,ny))
                    zero = zero - temp # 이러면 zero에 있던 폭탄들중에서도 해당되는 것들은 터졌다.
                    one = zero # 이제 0초가 1초가 된다..
                else:
                    two = one
                    zero = isgraph - one # 전체에서 2초를 뺀것이 이제 0초가 된다.
            for i in range(r):
                for j in range(c):
                    if (i,j) in one:
                        print("O", end='')
                    else:
                        print(".", end='')
                print()

     

    ★ 회고

     폭탄이 터지고 생기고를 반복하면서 격자 폭탄이 생기는 모양이 계속 바뀐다고 생각을 했다. 그래서 시뮬레이션 기법처럼 풀었다. 다 풀고 시간이 오래 걸리길래 문제를 다시 읽어보면서 힌트를 발견했고 힌트에서 격자의 모양이 반복되는 것을 알 수 있었다. 쉬운 문제들은 힌트를 잘 안 보고 푸는 풀어보자는 마인드였는데  쉬운 문제여도 힌트를 잘 봐야겠다.

     

Designed by Tistory.