문제
문제 바로가기> BOJ 17144번: 미세먼지 안녕!
풀이
문제에서 요구하는 대로 구현만 해주면 된다!
C++
#include<iostream>
#define MAX 51
using namespace std;
int ar = 0;
int R, C, T;
int home[MAX][MAX];
int copy_home[MAX][MAX];
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
void input(){
cin >> R >> C >> T;
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
cin >> home[i][j];
if(home[i][j] == -1){
home[i][j] = 0;
if(ar==0) ar = i; // 공기 청정기의 위치
}
}
}
}
void dust(){
int r, c, div;
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
if(home[i][j] == 0) continue; // 먼지가 없거나, 공기청정기인 경우
div = home[i][j]/5;
for(int d=0; d<4; d++){
r = i+dr[d];
c = j+dc[d];
if(r<0 || r>=R || c<0 || c>=C) continue; // 범위를 벗어나는 경우
if((r==ar || r==ar+1) && c==0) continue; // 공기청정기 위치인 경우
copy_home[r][c] += div;
copy_home[i][j] -= div;
}
}
}
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
home[i][j] += copy_home[i][j];
copy_home[i][j] = 0;
}
}
}
void clean(){
// 위쪽 순환
for(int i=ar-1; i>0; i--) home[i][0] = home[i-1][0]; // 하
for(int i=0; i<C-1; i++) home[0][i] = home[0][i+1]; // 좌
for(int i=0; i<ar; i++) home[i][C-1] = home[i+1][C-1]; // 상
for(int i=C-1; i>0; i--) home[ar][i] = home[ar][i-1]; // 우
// 아래쪽 순환
for(int i=ar+2; i<R-1; i++) home[i][0] = home[i+1][0]; // 상
for(int i=0; i<C-1; i++) home[R-1][i] = home[R-1][i+1]; // 좌
for(int i=R-1; i>ar+1; i--) home[i][C-1] = home[i-1][C-1]; // 하
for(int i=C-1; i>0; i--) home[ar+1][i] = home[ar+1][i-1]; // 우
}
void output(){ // T초가 지난 후 구사과의 방에 남아있는 미세먼지의 양
int ans = 0;
for(int i=0; i<R; i++){
for(int j=0; j<C; j++) ans+=home[i][j];
} cout << ans;
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
input();
while(T--){
dust(); // 미세먼지가 확산
clean(); // 공기청정기가 작동
}
output();
}
Java
import java.io.*;
import java.util.*;
public class Main {
static int ar = 0;
static int R, C, T;;
static int home[][], copy_home[][];
static int dr[] = {-1, 1, 0, 0};
static int dc[] = {0, 0, -1, 1};
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
home = new int[R][C];
copy_home = new int[R][C];
for(int i=0; i<R; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<C; j++) {
home[i][j] = Integer.parseInt(st.nextToken());
if(home[i][j] == -1){
home[i][j] = 0;
if(ar==0) ar = i; // 공기 청정기의 위치
}
}
}
while(T-- > 0){
dust(); // 미세먼지가 확산
clean(); // 공기청정기가 작동
}
output();
}
private static void dust() {
int r, c, div;
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
if(home[i][j] == 0) continue; // 먼지가 없거나, 공기청정기인 경우
div = home[i][j]/5;
for(int d=0; d<4; d++){
r = i+dr[d];
c = j+dc[d];
if(r<0 || r>=R || c<0 || c>=C) continue; // 범위를 벗어나는 경우
if((r==ar || r==ar+1) && c==0) continue; // 공기청정기 위치인 경우
copy_home[r][c] += div;
copy_home[i][j] -= div;
}
}
}
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
home[i][j] += copy_home[i][j];
copy_home[i][j] = 0;
}
}
}
private static void clean() {
// 위쪽 순환
for(int i=ar-1; i>0; i--) home[i][0] = home[i-1][0]; // 하
for(int i=0; i<C-1; i++) home[0][i] = home[0][i+1]; // 좌
for(int i=0; i<ar; i++) home[i][C-1] = home[i+1][C-1]; // 상
for(int i=C-1; i>0; i--) home[ar][i] = home[ar][i-1]; // 우
// 아래쪽 순환
for(int i=ar+2; i<R-1; i++) home[i][0] = home[i+1][0]; // 상
for(int i=0; i<C-1; i++) home[R-1][i] = home[R-1][i+1]; // 좌
for(int i=R-1; i>ar+1; i--) home[i][C-1] = home[i-1][C-1]; // 하
for(int i=C-1; i>0; i--) home[ar+1][i] = home[ar+1][i-1]; // 우
}
private static void output() {
int ans = 0;
for(int i=0; i<R; i++){
for(int j=0; j<C; j++) ans+=home[i][j];
}
System.out.println(ans);
}
}
'문제 풀이 > SW 역량 테스트' 카테고리의 다른 글
BOJ 23290번: 마법사 상어와 복제 (0) | 2023.01.16 |
---|---|
BOJ 17143번: 낚시왕 (0) | 2023.01.15 |
BOJ 14502번: 연구소 (0) | 2023.01.11 |
BOJ 14889번: 스타트와 링크 (0) | 2023.01.11 |
BOJ 15686번: 치킨 배달 (0) | 2023.01.10 |