danbibibi
article thumbnail

문제

문제 바로가기> BOJ 17144번: 미세먼지 안녕!

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

 

풀이

문제에서 요구하는 대로 구현만 해주면 된다! 

 

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
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로