728x90
🔗 문제 링크
💡 문제 풀이 및 해석
- 공기가 한 번에 다 퍼지게 해야된다. 따라서 모든칸에서 퍼지게 해야되므로 모든 칸에서 로직이 작동되게 해야된다.
- 현재 칸에서 퍼지게하고, 다음칸을 퍼지게하면, 이미 먼지가 퍼진 상태에서 로직이 실행되므로 먼지가 퍼지는 배열을 따로 만들어줘야 한다.
- 먼지가 다 퍼지면, 공기가 순환되게 해야된다. 이 때, 공기청정기로 들어오는 방향으로 1칸씩 땡기고, 공기청정기에서 나오는 칸만 0으로 처리해주면 된다.
- 마지막으로 모든 칸의 먼지를 다 더해주면 된다.
⭐️ 정답 코드 및 설명
#include<iostream>
#include<vector>
#define endl "\n"
using namespace std;
int R, C, T;
int next_x[] = { -1,1,0,0 };
int next_y[] = { 0,0,1,-1 };
int MAP[51][51];
int S_MAP[51][51];
int d_start;
void input() {
cin >> R >> C >> T;
for (int y = 1; y <= R; y++) {
for (int x = 1; x <= C; x++) {
cin >> MAP[y][x];
if (MAP[y][x] == -1) d_start = y;
}
}
}
void Spread(int y, int x) {
int cnt = 0;
int sp = MAP[y][x] / 5; // 퍼질 양
for (int i = 0; i < 4; i++) {
int nx = x + next_x[i];
int ny = y + next_y[i];
if (ny > 0 && ny <= R && nx > 0 && nx <= C) { // 범위 안에 있고
if (MAP[ny][nx] != -1) { // 공기 청정기가 아니면
S_MAP[ny][nx] += sp;
cnt++; // 퍼진 수
}
}
}
MAP[y][x] -= (sp * cnt); // 퍼진 양 * 퍼진 칸
}
void u_Wind(int x, int y) {
for (int Y = d_start - 2; Y > 1; Y--)
MAP[Y][1] = MAP[Y - 1][1];
for (int X = 1; X < C; X++)
MAP[1][X] = MAP[1][X + 1];
for (int Y = 1; Y < d_start - 1; Y++)
MAP[Y][C] = MAP[Y + 1][C];
for (int X = C; X > 2; X--)
MAP[d_start - 1][X] = MAP[d_start - 1][X - 1];
MAP[d_start - 1][2] = 0;
}
void d_Wind(int x, int y) {
for (int Y = d_start + 1; Y < R; Y++)
MAP[Y][1] = MAP[Y + 1][1];
for (int X = 1; X < C; X++)
MAP[R][X] = MAP[R][X + 1];
for (int Y = R; Y > d_start; Y--)
MAP[Y][C] = MAP[Y - 1][C];
for (int X = C; X > 2; X--)
MAP[d_start][X] = MAP[d_start][X - 1];
MAP[d_start][2] = 0;
}
void sol() {
while (T--) { // T초 반복
// 모든 칸에서 확산
for (int y = 1; y <= R; y++) {
for (int x = 1; x <= C; x++) {
if (MAP[y][x] == 0 || MAP[y][x] == -1) continue;
Spread(y, x);
}
}
for (int y = 1; y <= R; y++) {
for (int x = 1; x <= C; x++) {
MAP[y][x] += S_MAP[y][x];
S_MAP[y][x] = 0;
}
}
// 공기 청정기 위,아래
u_Wind(0, d_start - 1);
d_Wind(0, d_start);
}
int answer = 0;
for (int y = 1; y <= R; y++) {
for (int x = 1; x <= C; x++) {
answer += MAP[y][x];
}
}
cout << answer + 2;
}
int main() {
ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
input();
sol();
return 0;
}
🤔 문제 후기
문제를 풀면서 처음에는 공기가 순환하는 방향으로 계산했는데, 반대로 하면 간단하다는 것을 중간에 알았다. 그 외에는 먼지가 퍼지는 S_MAP을 생각하는데 시간이 조금 걸리긴 했지만, 전체적으로 시간은 15~25분 내로 풀 수 있던 문제였다.
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
[ 백준 14502 ] 연구소 (C++) - BFS (0) | 2024.03.08 |
---|---|
[ 백준 21608 ] 상어 초등학교 (C++) - 구현, BruteForce (0) | 2024.03.06 |
[ 백준 14503 ] 로봇 청소기 (C++) - 구현 (0) | 2024.03.06 |
[ 백준 1405 ] 미친 로봇 (C++) - DFS (0) | 2024.03.05 |
[ 프로그래머스 ] 다단계 칫솔 판매 (C++) - 구현 (2) | 2024.03.05 |