danbibibi
article thumbnail

1. 문제

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

2. 풀이

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

 

2.0.1. C++

<cpp />
#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(); }

 

2.0.2. Java

<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

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