BOJ 문제 링크: https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
N * M 크기의 배열 형태로 격자모양을 한 토마토 상자의 정보가 주어진다. 각 칸에는 0, 1, -1이 올 수있는데 각각 익지않은 토마토, 익은 토마토, 빈칸을 의미한다.
익은 토마토는 앞, 뒤, 좌, 우 4방향으로 익지 않은 토마토에게 영향을줘 다음날 익게만든다.
이러한 조건 속에서 토마토들의 정보가 주어졌을때 며칠이 지나면 토마토들이 모두 익는지 그 최소 일수를 구하면 되는 문제이다.
단, 토마토들이 전부 익는 경우가 없으면 -1를 출력한다.
bfs를 이용하면 문제를 풀 수 있지만 날짜를 계산하기 위해서는 추가적인 로직이 필요하다.
이를 위해서 앞으로 익을 토마토들의 목록을 저장하는 queue에 날짜구분자를 삽입하여 날짜를 구분할 수 있도록 한다.
#include<iostream> | |
#include<vector> | |
#include<queue> | |
using namespace std; | |
int x[4] = { 1, -1, 0, 0 }; | |
int y[4] = { 0 , 0, 1, -1 }; | |
// 앞으로 익을 토마토들의 목록을 저장하는 queue | |
queue<pair<int, int>> checkList; | |
int column, row; | |
int adj[1000][1000]; | |
// 토마토 상자 초기 정보를 adj와 checkList에 저장 | |
void init(int column, int row) { | |
for (int i = 0; i < row; i++) | |
for (int j = 0; j < column; j++) { | |
cin >> adj[i][j]; | |
if (adj[i][j] == 1) | |
checkList.push(make_pair(i, j)); | |
} | |
// 날짜 구분을 위해 (-1, -1)을 checkList에 삽입 | |
checkList.push(make_pair(-1, -1)); | |
} | |
// 상자 범위에 벗어나는지 확인 | |
bool validate(int x, int y) { | |
if (x < 0 || x >= column) | |
return false; | |
if (y < 0 || y >= row) | |
return false; | |
return true; | |
} | |
int bfs() { | |
int ret = 0; | |
// 익을 예정인 토마토가 없을때까지 반복 | |
while (!checkList.empty()) { | |
int curRow = checkList.front().first; | |
int curCol = checkList.front().second; | |
checkList.pop(); | |
// 날짜 구분자를 만날경우 | |
if (curRow == -1 && curCol == -1) { | |
// 더이상 익을 예정인 토마토가 없으면 break | |
if (checkList.empty()) | |
break; | |
// 날짜 구분자를 삽입 | |
checkList.push(make_pair(-1, -1)); | |
// 하루가 지남 | |
ret++; | |
continue; | |
} | |
// 4방향으로 오늘 익은 토마토 주위 검사 | |
for (int i = 0; i < 4; i++) { | |
int checkRow = curRow + y[i]; | |
int checkCol = curCol + x[i]; | |
// 다음날 익을 예정인 토마토인지 검사 | |
if (validate(checkCol, checkRow)&&adj[checkRow][checkCol]==0) { | |
adj[checkRow][checkCol] = 1; | |
checkList.push(make_pair(checkRow, checkCol)); | |
} | |
} | |
} | |
// 상자 전체의 토마토가 다 익었는지 검사 | |
for (int i = 0; i < row; i++) | |
for (int j = 0; j < column; j++) | |
if (adj[i][j] == 0) | |
ret = -1; | |
return ret; | |
} | |
int main() { | |
cin >> column >> row; | |
init(column, row); | |
cout << bfs() << endl;; | |
} |
코드 원본: https://github.com/sbl133/BOJ/blob/main/%237576.cpp
GitHub - sbl133/BOJ
Contribute to sbl133/BOJ development by creating an account on GitHub.
github.com

댓글을 통한 코드리뷰, 질문, 지적 언제든 환영입니다!
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 백준 1011번 Fly me to the Alpha Centauri c++ (0) | 2022.04.17 |
---|---|
[BOJ] 백준 2206번 벽 부수고 이동하기 c++ (0) | 2022.04.16 |
[BOJ] 백준 1759번 암호 만들기 c++ (0) | 2022.02.15 |
[BOJ] 백준 5430번 AC c++ (0) | 2022.02.11 |
[BOJ] 백준 1520번 내리막길 c++ (0) | 2021.11.22 |