보물창고 블로그

백준 알고리즘 3055번 탈출 풀이 with Python 본문

알고리즘 풀이/백준 알고리즘

백준 알고리즘 3055번 탈출 풀이 with Python

홋 메 2020. 2. 23. 00:58
728x90

문제 링크: https://www.acmicpc.net/problem/3055

 

3055번: 탈출

문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나

www.acmicpc.net

문제는 다음과 같다.

문제의 핵심은 각 시간마다 물이 갈 수 있는 곳을 먼저 설정해주고 다음으로 고슴도치를 이동시켜야 한다. 고슴도치를 먼저 이동시키면 그곳에 물이 들어갈 수도 있기 때문이다. 내가 해결한 코드는 다음과 같다.

def solution(start, map1, water, r, c):
    global waterdic
    global visit
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    time = 0
    queue = [[start[0], start[1]]]
    while 1:
        sub = []
        sub2 = []
        for w in water:
            x = w[0]
            y = w[1]
            for d in range(4):
                nx = x + dx[d]
                ny = y + dy[d]
                if -1 < nx < r and -1 < ny < c:
                    if waterdic.get((nx, ny)):
                        continue
                    else:
                        t = map1[nx][ny]
                        if t != 'D' and t != 'X':
                            waterdic[nx, ny] = True
                            sub2.append([nx, ny])
        water = sub2
        for p in queue:
            x = p[0]
            y = p[1]
            if map1[x][y] == 'D':
                return time
            for d in range(4):
                nx = x + dx[d]
                ny = y + dy[d]
                if -1 < nx < r and -1 < ny < c:
                    if waterdic.get((nx, ny)) or visit.get((nx, ny)) or map1[nx][ny] == 'X':
                        continue
                    else:
                        visit[(nx, ny)] = True
                        sub.append([nx, ny])
        queue = sub
        time += 1
        if not queue:
            break
    return -1


r, c = map(int, input().split())
map1 = []
start = []
water1 = []
waterdic = {}
visit = {}
for i in range(r):
    s = input()
    for j in range(c):
        if s[j] == 'S':
            start = [i, j]
        elif s[j] == '*':
            water1.append([i, j])
    map1.append(s)
ans = solution(start,map1,water1,r,c)
if ans == -1:
    print('KAKTUS')
else:
    print(ans)

 

 

Comments