[백준] 17144 미세먼지안녕!
삼성 역태 준비중! 제일 쉬워보이는 것부터 차근차근 푸는중
import java.util.*;
import java.io.*;
public class Main{
static int r;
static int c;
static int mac; // machine의 시작 열
public static void main(String []args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
int[][] map = new int[r][c];
mac = -1;
for(int i = 0 ; i < r ; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < c ; j++ ){
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == -1 && mac == -1){
mac = i;
}
}
}
while(t-- > 0){
diff(map); // 확산 결과를 반환하는 함수
circ(map); // 순환 결과를 반환하는 함수
}
int sum = 0;
for(int i = 0 ; i < r ; i++){
for( int j = 0 ; j < c ; j++ ){
sum += map[i][j];
}
}
System.out.println(sum+2); // machine때문에 빠진 2를 보충하여 출력
}
// 확산 결과를 반환하는 함수
static void diff(int[][] map){
// 확산 된 먼지를 저장할 임시 배열
int[][] temp = new int[r][c];
for(int i = 0 ; i < r ; i++ ){
for(int j = 0 ; j < c ; j++ ){
if(!(map[i][j] == 0 || map[i][j] == -1)){
int cnt = 4;
int d = map[i][j]/5;
// 기본적으로 if(이동할수 없는 조건) cnt-- else{ 해당자리temp += d } 라는 내용
if( i-1 < 0 || map[i-1][j] == -1 ){
cnt--;
}else{
temp[i-1][j] += d;
}
if( i+1 >= r || map[i+1][j] == -1){
cnt--;
}else{
temp[i+1][j] += d;
}
if( j-1 < 0 || map[i][j-1] == -1){
cnt--;
}else{
temp[i][j-1] += d;
}
if( j+1 >= c || map[i][j+1] == -1){
cnt--;
}else{
temp[i][j+1] += d;
}
map[i][j] -= d*cnt;
}
}
}
// 모든 확산이 끝났으면 최종적으로 map에 합쳐준다
for(int i = 0 ; i < r ; i++ ){
for(int j = 0 ; j < c ; j++ ){
map[i][j] += temp[i][j];
}
}
}
// 순환 결과를 반환하는 함수
static void circ(int[][] map){
// 일단 윗쪽 반(반시계 방향 순환) 부터 간다.
int rr = mac-1;
int cc = 0;
while(rr > 0){
map[rr][cc] = map[--rr][cc];
}
rr = 0;
while( cc < c-1 ){
map[rr][cc] = map[rr][++cc];
}
cc = c-1;
while( rr < mac ){
map[rr][cc] = map[++rr][cc];
}
rr = mac;
while( cc > 1 ){
map[rr][cc] = map[rr][--cc];
}
map[rr][1] = 0; // 신선한 공기
// 이제 아랫쪽 시계방향 순환원 처리
mac = mac+1;
rr = mac+1;
cc = 0;
while(rr < r-1){
map[rr][cc] = map[++rr][cc];
}
rr = r-1;
while( cc < c-1 ){
map[rr][cc] = map[rr][++cc];
}
cc = c-1;
while( rr > mac ){
map[rr][cc] = map[--rr][cc];
}
rr = mac;
while( cc > 1 ){
map[rr][cc] = map[rr][--cc];
}
map[rr][1] = 0; // 신선한 공기
mac = mac-1; // 다시 초기화 해줘야 t > 1일때 정상 작동하더라~
}
}
Comments