728x90
반응형
SMALL
백준 문제 풀이: 2638 [치즈]
문제 링크: https://www.acmicpc.net/problem/2638
문제 설명:
n×m 크기의 판에 치즈가 놓여 있습니다. 공기와 접촉한 치즈는 한 시간이 지나면 녹습니다. 치즈는 2변 이상이 공기와 접촉하면 녹게 됩니다. 모든 치즈가 녹을 때까지 걸리는 시간을 출력합니다.
입력:
- 첫째 줄에 판의 크기
n
(1 ≤n
≤ 100)과m
(1 ≤m
≤ 100)이 주어집니다. - 다음
n
개의 줄에 치즈 상태를 나타내는0
과1
이 주어집니다.1
은 치즈가 있는 칸,0
은 공기가 있는 칸을 나타냅니다.
출력:
- 모든 치즈가 녹을 때까지 걸리는 시간을 출력합니다.
문제 해결 코드
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n, m;
int board[101][101];
int visited[101][101];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
// BFS를 통해 외부 공기 탐색 및 치즈 녹이기
void bfs() {
queue<pair<int, int>> q;
q.push({0, 0});
visited[0][0] = 1;
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
if (visited[nx][ny]) continue;
if (board[nx][ny] == 0) { // 공기라면
visited[nx][ny] = 1;
q.push({nx, ny});
} else { // 치즈라면
board[nx][ny]++; // 공기와 접촉한 횟수 증가
}
}
}
}
// 치즈를 녹이고 상태를 갱신
bool meltCheese() {
bool cheeseLeft = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] >= 3) { // 2변 이상 공기와 접촉한 치즈는 녹음
board[i][j] = 0;
} else if (board[i][j] == 1 || board[i][j] == 2) { // 치즈가 남아있는 경우
board[i][j] = 1;
cheeseLeft = true;
}
}
}
return cheeseLeft;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> board[i][j];
}
}
int time = 0;
while (true) {
memset(visited, 0, sizeof(visited));
bfs(); // 외부 공기 탐색 및 치즈 녹이기 준비
if (!meltCheese()) break; // 치즈가 모두 녹았는지 확인
time++;
}
cout << time << '\n';
return 0;
}
예제
입력:
8 9
0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0
0 0 0 1 1 0 1 1 0
0 0 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 1 1 0 1 1 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0
출력:
4
입력:
5 5
0 0 0 0 0
0 1 1 0 0
0 1 1 0 0
0 0 0 1 1
0 0 0 1 1
출력:
2
코드 설명
- 외부 공기 탐색: BFS를 통해 외부 공기를 탐색하며, 공기와 접촉한 치즈의 접촉 횟수를 증가시킵니다.
- 치즈 녹이기: 접촉 횟수가 2 이상인 치즈를 녹이며, 남아있는 치즈 여부를 확인합니다.
- 반복 종료: 더 이상 치즈가 남아있지 않으면 반복을 종료합니다.
시간 복잡도
- BFS의 시간 복잡도: O(n × m)
- 치즈 녹이기 반복: 최대 O(n × m)
- 전체 시간 복잡도: O((n × m)²)
결과
코드는 입력된 행렬에서 치즈가 모두 녹을 때까지 걸리는 시간을 정확히 계산합니다. BFS를 활용한 접근 방식으로 효율적으로 문제를 해결합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
반응형
LIST
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 11404번 [플로이드](C++)-yes6686- 티스토리 (0) | 2024.12.29 |
---|---|
백준 5639번 [이진 검색 트리](C++)-yes6686- 티스토리 (0) | 2024.12.26 |
백준 2206번 [벽 부수고 이동하기](C++) -yes6686- 티스토리 (0) | 2024.12.26 |
백준 1991번 [트리 순회](C++) -yes6686- 티스토리 (0) | 2024.12.26 |
백준 1987번 [알파벳](C++) -yes6686- 티스토리 (0) | 2024.12.26 |