Baek_ 5427, 4179

원성혁·2023년 1월 23일
0

algorithm

목록 보기
20/21
post-thumbnail

현재 골드2에 머문지 너무 오래되었고 탈출을 위해 골드 수준 문제를 많이 풀어야 겠다고 생각했다.

불이란 문제는 BFS 분류에 있었고 실력향상을 위해 도전해봤다.

import sys
input = sys.stdin.readline
from collections import deque

def bfs(cur,fire):
    global flag,count
    dq_person = deque(cur)
    dq_fire = deque(fire)
    while dq_person and not flag:
        for c in range(len(dq_person)):
            cur_x,cur_y = dq_person.popleft()
            if visit[cur_x][cur_y] == 2:
                continue
            for a,b in [[0,1],[1,0],[-1,0],[0,-1]]:
                cur_xa,cur_yb = cur_x+a,cur_y+b
                if not(0<=cur_xa<h and 0<= cur_yb<w):
                    flag = True
                elif matrix[cur_xa][cur_yb] == '.' and visit[cur_xa][cur_yb] == 0:
                    visit[cur_xa][cur_yb] = 1
                    dq_person.append((cur_xa,cur_yb))
        for c in range(len(dq_fire)):
            fire_x,fire_y = dq_fire.popleft()
            for a,b in [[0,1],[1,0],[-1,0],[0,-1]]:
                fire_xa,fire_yb = fire_x+a,fire_y+b
                if 0<=fire_xa<h and 0<=fire_yb<w and (matrix[fire_xa][fire_yb] == '.' or matrix[fire_xa][fire_yb] == '@') and visit[fire_xa][fire_yb] < 2:
                    visit[fire_xa][fire_yb] = 2
                    matrix[fire_xa][fire_yb] = '*'
                    dq_fire.append((fire_xa,fire_yb))
        count+=1
cnt = int(input())
for _ in range(cnt):
    w,h = map(int,input().split())
    matrix = list()
    visit = [[0]*w for i in range(h)]
    cur = list()
    fire = list()
    for i in range(h):
        t = list(input().rstrip())
        for j,val in enumerate(t):
            if val == '@':
                cur.append((i,j))
            elif val == '*':
                fire.append((i,j))
        matrix.append(t)
    flag = False
    count = 0
    bfs(cur,fire)
    print(count if flag else 'IMPOSSIBLE')

무난하게 잘 통과했다.
예전에 삼성문제 풀때 자동차와 텐트 같이 두개를 한번에 움직이는 것에 있어서 고생을 했던거 같은데 과거에는 matrix에 그 문자를 저장해야겠다고 생각을 했던것 거 같다.

지금은 visit 함수를 통해서만 확인 가능 하도록 하고 matrix는 오로지 벽의 존재 정도만 확인하는 용도로 사용했다.

사람이 4방향으로 움직이고 그다음 불이 움직여 사람을 덮는다.
사람이 하나도 안남으면 while을 종료하며 그전에 도착하는 경우가 생기면 통과다.

visit을 원래 True, False 개념으로만 사용했었는데 골드 4부터 나는 숫자를 넣어서 특정 객체의 지나간 여부 판단을 사용하고 있다.

import sys
input = sys.stdin.readline
from collections import deque

def bfs(cur,fire):
    global flag,count
    dq_person = deque(cur)
    dq_fire = deque(fire)
    while dq_person and not flag:
        for c in range(len(dq_person)):
            cur_x,cur_y = dq_person.popleft()
            if visit[cur_x][cur_y] == 2:
                continue
            for a,b in [[0,1],[1,0],[-1,0],[0,-1]]:
                cur_xa,cur_yb = cur_x+a,cur_y+b
                if not(0<=cur_xa<h and 0<= cur_yb<w):
                    flag = True
                elif matrix[cur_xa][cur_yb] == '.' and visit[cur_xa][cur_yb] == 0:
                    visit[cur_xa][cur_yb] = 1
                    dq_person.append((cur_xa,cur_yb))
        for c in range(len(dq_fire)):
            fire_x,fire_y = dq_fire.popleft()
            for a,b in [[0,1],[1,0],[-1,0],[0,-1]]:
                fire_xa,fire_yb = fire_x+a,fire_y+b
                if 0<=fire_xa<h and 0<=fire_yb<w and (matrix[fire_xa][fire_yb] == '.' or matrix[fire_xa][fire_yb] == 'J') and visit[fire_xa][fire_yb] < 2:
                    visit[fire_xa][fire_yb] = 2
                    matrix[fire_xa][fire_yb] = 'F'
                    dq_fire.append((fire_xa,fire_yb))
        count+=1

h,w = map(int,input().split())
matrix = list()
visit = [[0]*w for i in range(h)]
cur = list()
fire = list()
for i in range(h):
    t = list(input().rstrip())
    for j,val in enumerate(t):
        if val == 'J':
            cur.append((i,j))
        elif val == 'F':
            fire.append((i,j))
    matrix.append(t)
flag = False
count = 0
bfs(cur,fire)
print(count if flag else 'IMPOSSIBLE')

불을 풀고 불!를 봤는데 굉장히 유사해서 아주 약간 고쳐서 풀었다.
심지어 처음에 bfs 조건에 있는 문자를 잘못 써서 제출했는데도 맞았다고 떴다ㅋㅋ

한번에 두문제 점수를 얻어서 아주 기분이 좋았다.

profile
AI개발자를 향해 전진중

0개의 댓글