ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_3055_탈출 (python)
    Algorithm/백준_생각정리 2023. 5. 11. 13:22

    ● 접근 방법

     문제에서 상하좌우로 이동한다는 힌트를 줘서 bfs인 것을 알았고 격자의 크기가 50으로 크지 않았기 때문에 bfs로 풀기로 결정했다.

     

    ● 풀이법

     문제에서 '다음 시간에 물이 찰 예정인 칸으로 고슴도치는 이동할 수 없다.' 이런 말을 한다. 이 말을 보고 물을 먼저 움직여야겠다고 생각했다. 왜냐하면 물과 고슴도치는 동시에 움직이는 것이지만 물을 먼저 움직여놓고 도치가 움직인다고 했을 때 그 칸에 물이 있으면 즉, 물이 이동할 예정인 칸이었으면 도치가 해당 칸으로는 이동하지 못하기 때문이다. 그러나 유의해야 할 점은 필자는 여기서 많이 헤맸는데 임의로 물을 먼저 움직인다고 가정했을 뿐이지 도치와 물은 동시에 움직이는 것이다. 즉, 물을 먼저 움직여 도치가 있는 칸에 물이 들어왔다고 하더라도 사실은 동시에 움직이는 것이었기 때문에 그 고슴도치는 어딘가로 이동했을 것이다.  그 다음 bfs 문제를 풀 때 원래 입력받은 data의 보존을 위해서 visited로 방문 처리를 하는 편인데 여기서 visited를 쓰면 시간초과가 나게 된다. 격자의 크기가 그렇게 크지 않은데 visited를 쓰면 왜 시간초과가 나는지는 아직까지 잘 모르겠다. 

     

    ● 코드

    n = int(input())
    r,c = 101, 101
    graph = [[0] * c for i in range(r)]
    # 왼쪽 아래 오른쪽 위로
    dy = [0,1,0,-1]
    dx = [-1,0,1,0]
    # 1세대의 시작은 오른쪽으로 가는 화살표이니
    def check(x, y, d, g):
        before = [2]
        for i in range(g):
            tp = []
            tp += before
            for j in range(len(before)-1, -1, -1):
                tp.append((before[j] + 1) % 4)
            before = tp[:]
        tp = []
        for i in before:
            tp.append((i + d) % 4)
        graph[y][x] = 1
        for i in tp:
            nx = x + dx[i]
            ny = y + dy[i]
            graph[ny][nx] = 1
            x,y = nx, ny
    
    for i in range(n):
        x,y,d,g = map(int,input().split())
        check(x, y, d, g)
    
    answer = 0
    
    for i in range(r-1):
        for j in range(c-1):
            if graph[i][j] == 1 and graph[i+1][j] == 1 and graph[i][j+1] == 1 and graph[i+1][j+1] == 1:
                answer += 1
    
    print(answer)

    ● 회고

     문제에서 주어지지 않는 내가 정한 가정에 스스로 갇히지 말자!!

Designed by Tistory.