한걸음

[220925] 백준 4179 : 불! 본문

Coding Test

[220925] 백준 4179 : 불!

우당탕탕 할 수 있다!!! 2022. 9. 25. 21:16
반응형

https://www.acmicpc.net/problem/4179

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다.  각각의 문

www.acmicpc.net

1. 주의할 점

 지훈이와 불은 같이 움직인다. 불이 움직일 경로에 지훈이가 가면 안 된다는 것을 꼭 명심하자! 이 점만 유의하면 쉽게 답을 도출할 수 있다. 같은 유형의 문제를 먼저 풀어봤기 때문에 어렵지 않았다.

 

https://aeromaster.tistory.com/38

 

 

[220925] 백준 3055 : 탈출

https://www.acmicpc.net/problem/3055 3055번: 탈출 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도

aeromaster.tistory.com

2. 전체 코드

메모리 : 177908 KB, 시간 564 ms, 풀이 시간 : 18분

R, C = map(int, input().split())
board = [list(map(str, input())) for _ in range(R)]
f_info = []
for i in range(R):
    for j in range(C):
        if board[i][j] == 'J' :
            sx, sy = i, j
            board[i][j] = '.'
        if board[i][j] == 'F' :
            f_info.append([i, j])

visited = [[0 for _ in range(C)] for _ in range(R)]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def fire():
    size = len(f_info)
    for f in range(size):
        x, y = f_info[f]
        for d in range(4):
            nx = x + dx[d]
            ny = y + dy[d]
            if 0 <= nx < R and 0 <= ny < C and board[nx][ny] == '.' :
                board[nx][ny] = 'F'
                f_info.append([nx, ny])
    del f_info[:size]

def jihun():
    q = [[sx, sy]]
    visited[sx][sy] = 1
    fire()
    while q :
        qsize = len(q)
        for it in range(qsize):
            x, y = q[it]
            if x == 0 or x == R - 1 or y == 0 or y == C - 1 :
                return visited[x][y]
            for d in range(4):
                nx = x + dx[d]
                ny = y + dy[d]
                if 0 <= nx < R and 0 <= ny < C and not visited[nx][ny] and board[nx][ny] == '.' :
                    visited[nx][ny] = visited[x][y] + 1
                    q.append([nx, ny])
        del q[:qsize]
        fire()
    return "IMPOSSIBLE"

print(jihun())
반응형