티스토리 뷰
https://www.acmicpc.net/problem/5427
5427번: 불
상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에�
www.acmicpc.net
난이도 : 골드 4
BFS를 이용해 풀었습니다.
2020/08/01 - [문제풀이/자바] - [백준 3055] 탈출 (자바)
[백준 3055] 탈출 (자바)
https://www.acmicpc.net/problem/3055 3055번: 탈출 문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고
jellyinghead.tistory.com
턴 시작 때 불을 번지게 하는 것이 이 문제와 유사하네요.
불이 번지게 하기 위해 불이 붙은 칸을 큐로 관리했습니다.
처음엔 리스트로 관리하다가 메모리 초과가 나서 큐로 바꿨습니다.
메모리 초과와 시간 초과 둘 다 맛봤는데요. 이것은 자료구조 문제가 아닌 로직이 잘못이었습니다.
불이 붙은 칸에서 불이 번지게 한 후에 다시 큐에 넣었습니다. 곰곰이 생각해보니 이미 불을 번지게 한 칸은 다시 쓸 일이 없었던 것이라 쓸모가 없었습니다. 덕분에 메모리, 시간 초과가 났었네요.
전역 변수
int w, h = 문제에서 주어진 맵의 크기
char map[][] = 입력된 맵
Queue <Point> fire = 불의 위치를 저장하는 큐(불이 번져야 할 칸 - 원인)
int dx[], dy[] = 이동을 위한 배열
boolean visit[][] = 방문을 체크할 배열
StringBuilder sb = 출력 값
메소드
void main
입력을 받고 상근이의 시작 위치를 x, y에 따로 저장합니다. 불의 위치는 fire에 넣어줍니다.
(excape 호출)
void escape
탈출을 시작합니다. 매 턴이 시작되기 전(상근의 이동 전) 불은 1칸씩 번집니다. 상근이 만약 지정된 맵의 크기를 벗어나는 위치를 가지게 된다면 탈출입니다.
(burn 호출)
void burn
불을 번지게 합니다.
큐의 앞에는 번져야 할 위치들, 큐의 뒤에는 번진 위치들이 쌓여 있습니다.
그렇기 때문에 size로 번져야 할 위치들의 크기를 미리 가져옵니다.
불을 4방향으로 번지게 한 후에 큐에 넣습니다. 불이 번지는 곳은 빈칸인 '.', 상근이의 위치인 '@'입니다.
class Point
x, y 좌표를 저장하는 클래스입니다.
'문제풀이 > 백준 && 프로그래머스' 카테고리의 다른 글
[백준 12094] 2048 (Hard) (자바) (0) | 2020.10.12 |
---|---|
[백준 2957] 이진 탐색 트리 (자바) (0) | 2020.10.11 |
[백준 5557] 1학년 (자바) (2) | 2020.10.06 |
[백준 12100] 2048 (Easy) (자바) (0) | 2020.10.02 |
[백준 2252] 줄 세우기 (자바) (0) | 2020.10.02 |