문제 주소 : https://www.acmicpc.net/problem/7576
정답 비율 : 33.448% (2021.07.15. 20:18 기준)
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
문제 요약 :
M x N 크기의 구역이 주어질 때 특정 칸들에는 1이 채워져 있고 특정 칸들에는 –1로 채워져 있고 나머지는 0으로 채워져 있습니다. 하루 지날 때마다 1로 채워져 있는 칸은 상, 하, 좌, 우 칸을 1로 채웁니다. 이때 –1로 채워져 있는 칸은 채울 수 없습니다.
이런 상황에서 0으로 채워진 모든 칸을 채우는 필요한 최소 일수를 구하면 됩니다.
문제 조건 :
입력 : 첫 줄에 M과 N이 차례대로 주어집니다. (M, N : 2 ~ 1000) 이어서 각 칸의 정보가 주어집니다.
출력 : 0으로 채워진 모든 칸을 1로 채우는 데 필요한 최소 일수를 출력
시간 : 1초
문제 풀이 :
BFS 문제입니다. 입력받을 때 1로 채워진 칸의 정보를 큐에 삽입 후에 하나씩 pop을 수행 후에 pop 한 데이터에 의해 영향받은 칸들을 다시 큐에 저장하는 형식으로 수행하면 됩니다. 이를 큐가 비었을 때까지 반복하면 됩니다.
코드는 다음과 같습니다.
C99
// solve 7576
#include <stdio.h>
#include <stdlib.h>
#define QMAX 1000000
typedef struct _point {
int x;
int y;
}Point;
Point queue[QMAX];
int map[1000][1000];
int count = 0, front = -1, rear = -1;
int main(void) {
int xMax, yMax;
int dir_x[4] = { 1, -1, 0, 0 };
int dir_y[4] = { 0, 0, 1, -1 };
scanf("%d %d", &xMax, &yMax);
for (int i = 0; i < yMax; i++) {
for (int j = 0; j < xMax; j++) {
scanf("%d", &map[i][j]);
if (map[i][j] == 0)
count++;
else if (map[i][j] == 1)
{
rear++;
queue[rear].x = j;
queue[rear].y = i;
}
}
}
if (count == 0) {
printf("0");
}
else {
while (rear != front) {
int tx = queue[++front].x;
int ty = queue[front].y;;
for (int i = 0; i < 4; i++) {
if (tx + dir_x[i] >= 0 && tx + dir_x[i] < xMax) {
if (ty + dir_y[i] >= 0 && ty + dir_y[i] < yMax) {
if (map[ty + dir_y[i]][tx + dir_x[i]] == 0) {
map[ty + dir_y[i]][tx + dir_x[i]] = map[ty][tx] + 1;
rear++;
queue[rear].x = tx + dir_x[i];
queue[rear].y = ty + dir_y[i];
count--;
}
}
}
}
}
printf("%d", count == 0 ? map[queue[rear].y][queue[rear].x] - 1 : -1);
}
return 0;
}
-> M와 N의 최대 값에 따라서 큐의 최대 크기는 1,000,000입니다.
-> count는 0인 칸의 개수를 가지고 있는 변수입니다.
-> map에 직접 해당 칸이 1로 바뀌는데 걸리는 요일 수 + 1을 저장합니다. (시작 수가 1로 시작하기 때문입니다.)
'Algorithm Trainning > 백준 알고리즘(BEAKJOON)' 카테고리의 다른 글
백준 : 4571번, Grade School Multiplication (0) | 2021.12.19 |
---|---|
백준 : 10757번, 큰 수 A+B (0) | 2021.07.26 |
백준 : 2292번, 벌집 (0) | 2021.06.29 |
백준 : 3273번, 두 수의 합 (0) | 2021.06.28 |
백준 : 8980번, 택배 (0) | 2021.06.27 |