반응형
우리가치 모각코 7회차
1. 일시
👉🏻 2022년 11월 03일
2. 장소
👉🏻 성곡도서관 지하 1층 카페 인피니티 / 예술관 카페
3. 학습내용
오늘은 각자 풀고 싶은 알고리즘 문제를 정하고, 풀어보는 시간을 갖었다.
오늘도 저번과 같이 BFS, DFS 관련 알고리즘 문제를 풀어보았다.
#7576
내가 정한 첫 번째 문제는7576번의 토마토 문제다.
#include <iostream>
#include <queue>
#include <utility>
using namespace std;
#define MX 1001
#define X first
#define Y second
int tom[MX][MX];
int dt[MX][MX];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
queue<pair<int, int>> Q;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> m >> n;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
{
cin >> tom[i][j];
if (tom[i][j] == 1)
Q.push({i, j});
if (tom[i][j] == 0)
dt[i][j] = -1;
}
while (!Q.empty())
{
pair<int, int> cur = Q.front();
Q.pop();
for (int d = 0; d < 4; ++d)
{
int nx = cur.X + dx[d];
int ny = cur.Y + dy[d];
if (nx < 0 || n <= nx || ny < 0 || m <= ny)
continue;
if (dt[nx][ny] >= 0)
continue;
Q.push({nx, ny});
dt[nx][ny] = dt[cur.X][cur.Y] + 1;
}
}
int mx = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (dt[i][j] == -1)
{
cout << "-1\n";
return 0;
}
mx = max(mx, dt[i][j]);
}
}
cout << mx << "\n";
return 0;
}
#7569
내가 정한 두 번째 문제는 7569번의 토마토 문제인데, 이 문제는 위 문제에서 상자가 겹쳐있어 한 차원 더 높여 3차원 배열을 사용해야 하는 문제다.
#include <iostream>
#include <queue>
using namespace std;
#define MX 101
int m, n, h;
int tom[MX][MX][MX];
int dz[8] = {0, 0, 0, 0, 1, -1};
int dx[8] = {1, 0, -1, 0, 0, 0};
int dy[8] = {0, 1, 0, -1, 0, 0};
int dt[MX][MX][MX];
struct strt
{
int z;
int x;
int y;
};
queue<strt> Q;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> m >> n >> h;
for (int k = 0; k < h; ++k)
{
for (int i = 0; i < n; ++i)
{
// fill(dt[k][i], dt[k][i] + m, -1);
for (int j = 0; j < m; ++j)
{
cin >> tom[k][i][j];
if (tom[k][i][j] == 1)
{
Q.push({k, i, j});
dt[k][i][j] = 0;
}
if (tom[k][i][j] == 0)
dt[k][i][j] = -1;
}
}
}
while (!Q.empty())
{
strt cur = Q.front();
Q.pop();
for (int d = 0; d < 6; ++d)
{
int nz = cur.z + dz[d];
int ny = cur.y + dy[d];
int nx = cur.x + dx[d];
if (nz < 0 || h <= nz || nx < 0 || n <= nx || ny < 0 || m <= ny)
continue;
if (dt[nz][nx][ny] > 0 || tom[nz][nx][ny] != 0)
continue;
dt[nz][nx][ny] = dt[cur.z][cur.x][cur.y] + 1;
Q.push({nz, nx, ny});
}
}
int mx = 0;
for (int k = 0; k < h; ++k)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (dt[k][i][j] == -1)
{
cout << "-1\n";
return 0;
}
mx = max(mx, dt[k][i][j]);
}
}
}
cout << mx << "\n";
return 0;
}
4. 소감(느낀 점)
bfs, dfs를 알면 풀 문제들이 많다는 친구들의 말을 이 개념들을 익히고 문제를 풀기 전까지는 이렇게까지 와닿지 않았는데, 정말 풀 수 있는 관련된 문제들이 많은 것 같다. 한 문제 푸는 것도 이전과 다르게 많은 시간이 소요되는데 문제 푸는 시간을 줄일 수 있도록 노력해야겠다. 모각코를 통해 자극받아, 꾸준히 알고리즘 문제를 풀 수 있어 성취감도 느끼고 계속 좋은 활동으로 이어지는 것 같다.
https://www.acmicpc.net/problem/7576
https://www.acmicpc.net/problem/7569
https://www.youtube.com/c/BaaarkingDog/videos
반응형