탈출 (백준 3055번 파이썬)

Run·2021년 8월 23일
0

TIL

목록 보기
7/8

정말 수십개의 테스트 케이스를 돌렸는데도 다 맞았는데 백준 이녀석은 게속 틀렸다고 해 삼일째 당황스러웠다. 해결하고나니 너무 허무하당...

문제 풀이

필요 요소
1. 데이터 담을 2차원 배열
2. 고슴이가 갈 길을 찾기 위한 큐
3. 물이 갈 길을 찾기 위한 큐

로직 순서
1. 데이터를 2차원 배열에 담으면서 S이면 시작하면 도슴이큐에 *이면 물큐에 담아준다.
2. 날짜 구별을 해주기 위해 while문 돌기 전 물큐의 길이를 체크하고
3. 그 길이만큼 while문을 돌리며 좌우상하에 빈칸인지 확인한다.
4. 빈칸이면 칸을 먹는다.
5. 고슴이도 그렇게 해준다.
6. 만약 고슴이가 D를 만나면 날짜를 출력해주고 끝낸다.

코드

import sys
from collections import deque
R,C = map(int, sys.stdin.readline().split())

li= [[0]*C for _ in range(R)]
gosum = deque()
water = deque()
for i in range (R):
    tmp = sys.stdin.readline()
    for j in range(C):
        li[i][j] = tmp[j]
        if tmp[j] == 'S':
            gosum.append((j,i))
            li[i][j] = 0
        elif tmp[j] == '*':
            water.append((j,i))
dx ,dy = [0,0,1,-1], [1,-1,0,0]
flag = False

while True:
    water_len = len(water)
    while water_len:
        x,y  = water.popleft()
        water_len -=1
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            if 0<= nx < C and 0<= ny <R and li[ny][nx] == '.':
                li[ny][nx] = '*'
                water.append((nx,ny))
    if  len(gosum) ==0:
        print('KAKTUS')
        break
    gosum_len = len(gosum)

    while gosum_len:
        x,y = gosum.popleft()
        gosum_len-=1
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]

            if 0<= nx < C and 0<= ny <R:
                if li[ny][nx] == 'D':
                    print(li[y][x] +1)
                    flag = True
                    break
                elif li[ny][nx] == '.':
                    li[ny][nx] = li[y][x] +1
                    gosum.append((nx,ny))
        if flag:
            break
    if flag:
        break
profile
정글에서 살아남기

0개의 댓글