728x90
반응형
https://www.acmicpc.net/problem/17144
1. Logic
구현은 어렵지 않은문제인데 실수하기 쉬운 문제인 것 같다.
1. 입력을 받고 공기청정기가 있는 위치의 y좌표를 저장해둔다.
2. 미세먼지의 합을 더할 임시 배열에 먼지를 /5한 값을 4방향으로 더해준다.
3. 이전 먼지 배열과 임시배열을 더해줌과 동시에 0으로 초기화해준다.
2. Code
#include <bits/stdc++.h>
using namespace std;
int r, c, t;
int dusts[51][51];
int sumTemp[51][51];
int airCleaner[2];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
void topSideCleaner() {
int airY = airCleaner[0];
for(int i = airY-1; i > 0; i--) {
dusts[i][0] = dusts[i-1][0];
}
for(int i = 0; i < c-1; i++) {
dusts[0][i] = dusts[0][i+1];
}
for(int i = 0; i < airY; i++) {
dusts[i][c-1] = dusts[i+1][c-1];
}
for(int i = c-1; i > 0; i--) {
if(i == 1) dusts[airY][i] = 0;
else dusts[airY][i] = dusts[airY][i-1];
}
}
void downSideCleaner() {
int airY = airCleaner[1];
for(int i = airY+1; i < r-1; i++) {
dusts[i][0] = dusts[i+1][0];
}
for(int i = 0; i < c-1; i++) {
dusts[r-1][i] = dusts[r-1][i+1];
}
for(int i = r-1; i > airY; i--) {
dusts[i][c-1] = dusts[i-1][c-1];
}
for(int i = c-1; i > 0; i--) {
if(i == 1) dusts[airY][i] = 0;
else dusts[airY][i] = dusts[airY][i-1];
}
}
int start() {
while(t--) {
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
if(dusts[i][j] <= 0) continue;
int cnt = 0;
for(int k = 0; k < 4; k++) {
int ndx = j + dx[k];
int ndy = i + dy[k];
if(ndx < 0 || ndx >= c || ndy < 0 || ndy >= r) continue;
if(dusts[ndy][ndx] == -1) continue;
cnt++;
sumTemp[ndy][ndx] += dusts[i][j] / 5;
}
dusts[i][j] -= ((dusts[i][j]/5)*cnt);
}
}
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
dusts[i][j] += sumTemp[i][j];
sumTemp[i][j] = 0;
}
}
topSideCleaner();
downSideCleaner();
}
int sum = 0;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
if(dusts[i][j] <= 0) continue;
sum += dusts[i][j];
}
}
return sum;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> r >> c >> t;
int cnt = 0;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
cin >> dusts[i][j];
if(dusts[i][j] == -1) {
airCleaner[cnt] = i;
cnt++;
}
}
}
cout << start();
}
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 17244 아맞다우산 C++ :: BFS (2) | 2023.12.29 |
---|---|
[백준/Baekjoon] 1194 달이 차오른다, 가자. C++ :: BFS & Implementation (1) | 2023.12.28 |
[백준/Baekjoon] 11054 가장 긴 바이토닉 부분 수열 C++ :: Dynamic Programming (0) | 2023.12.25 |
[백준/Baekjoon] 2580 스도쿠 C++ :: Back tracking & Implementation (0) | 2023.12.25 |
[백준/Baekjoon] 20056 마법사 상어와 파이어볼 C++ :: Implementation (1) | 2023.12.23 |