-
[백준][자바][17144] 미세먼지 안녕!코딩/알고리즘 2019. 4. 21. 22:48
아 머리아프다...
이 문제는 알고보면
풀란대로 풀면 끝나는 아주 간단한 문제인데.
선행학습이 안되어있으면 좀 삽질을 거듭할수 있다.
중점적으로 볼사항은
일단 퍼트릴떄 초기 맵을 건드리면 안되는 문제와 ( 그래서 COPYMAP 을 사용함)
공기 청정기 위 아래의 바람에 따라서 먼지의 이동만 잘 구현 해놓으면 풀리는 문제이다
큐를 써서 하려고 했는데 위와 같은 문제에 봉착해서 다른 분들 코드를 참고해서 포문 2개로 풀었는데
꼭큐를 쓸꺼야 하는 그런 강박관념은 없어도 될것같다.
아 그리고 보니...안쓰는 코드 정리를 안했네....
곧 카페가 문을 닫아서 나중에 수정해야겠다.ㅠㅠ
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; class Dust{ int y; int x; int value; Dust(int y, int x, int value){ this.y = y; this.x = x; this.value = value; } } class AirCleaner{ int y; int x; int position; AirCleaner(int y, int x, int position ){ this.y = y; this.x = x; this.position = position; } } public class Main_Backjoon_17144_미세먼지안녕 { static int R; static int C; static int T; static int[] dx = {1, -1, 0, 0}; static int[] dy = {0, 0, 1, -1}; static int[][] MAP = new int[1001][1001]; static int[][] TEMPMAP = new int[1001][1001]; static Queue q = new LinkedList(); static ArrayList air = new ArrayList(); 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()); T = Integer.parseInt(st.nextToken()); // r, c, s, d, z for(int i = 0 ; i < R; i++ ) { st = new StringTokenizer(br.readLine() , " "); int idx = 0 ; int flag = 0; // 0은 up, 1down while(st.hasMoreTokens()){ MAP[i][idx] = Integer.parseInt(st.nextToken()); // if(MAP[i][idx] != 0 && MAP[i][idx] != -1) { // q.add(new Dust(i, idx, MAP[i][idx])); // }else if(MAP[i][idx] == -1 ) { // air.add(new AirCleaner(i, idx, flag)); // flag = 1; // } if(MAP[i][idx] == -1 ) { air.add(new AirCleaner(i, idx, flag)); flag = 1; } idx += 1; } } // printMap(); // System.out.println(); // spreadNew(); // System.out.println(); // printMap(); for(int i = 0 ; i < T ; i++) { spreadNew(); airCircult(); //printMap(); //System.out.println(); } count(); } public static void count() { int SUM = 0; for(int i = 0; i < R; i++) { for(int j =0; j < C; j++) { if(MAP[i][j] != -1) { SUM += MAP[i][j]; } } } System.out.println(SUM); } public static void copyMap(int[][] COPYMAP, int[][] MAP) { for(int i = 0; i < R; i++) { for(int j =0; j < C; j++) { COPYMAP[i][j] = MAP[i][j]; } } } //q에 넣고 public static void spreadNew() { int[][] COPYMAP = new int[R][C]; copyMap(COPYMAP, MAP); for(int i = 0; i < R; i++) { for(int j = 0; j < C; j++) { if( MAP[i][j] != -1 && MAP[i][j] != 0) { int value = MAP[i][j]; int spread = value / 5; //기존 MAP 에서 int count = 0 ; for(int d = 0; d < 4; d++) { int xx = dx[d] + j; int yy = dy[d] + i; if(xx >= 0 && xx < C && yy >= 0 && yy < R) { if( MAP[yy][xx] != -1) { COPYMAP[yy][xx] += spread; count += 1; } } } //Ar,c - (Ar,c/5)×(확산된 방향의 개수) //이미 확산되서 더해진 것도 생각해야함 COPYMAP[i][j] = COPYMAP[i][j] - ( value / 5 ) * count; } } } copyMap(MAP, COPYMAP); } public static void airCircult() { for(int idx = 0 ; idx< 2; idx++) { AirCleaner cleaner = air.get(idx); if( idx == 0 ) { int ay = cleaner.y; int ax = cleaner.x; //아래로 땡기기 for(int y = ay-1; y > 0; y--) { MAP[y][ax] = MAP[y-1][ax]; //arrList.add(new Dust( y, ax, MAP[y][ax])); } //오른쪽 for(int x = 0; x < C -1 ; x++) { MAP[0][x] = MAP[0][x + 1]; //arrList.add(new Dust( ay, x, MAP[ay][x])); } //밑으로 for(int y = 0; y < ay; y++) { MAP[y][C-1] = MAP[y+1][C-1]; //arrList.add(new Dust( y, ax, MAP[y][ax])); } //왼쪽 for(int x = C-1; x > ax +1 ; x--) { MAP[ay][x] = MAP[ay][x - 1]; //arrList.add(new Dust( ay, x, MAP[ay][x])); } MAP[ay][ax+ 1] = 0; } if( idx == 1 ) { int ay = cleaner.y; int ax = cleaner.x; //아래로 땡기기 for(int y = ay+1; y < R; y++) { MAP[y][ax] = MAP[y+1][ax]; //arrList.add(new Dust( y, ax, MAP[y][ax])); } //오른쪽 for(int x = 0; x < C -1 ; x++) { MAP[R-1][x] = MAP[R-1][x + 1]; //arrList.add(new Dust( ay, x, MAP[ay][x])); } //위 for(int y = R -1 ; y > ay -1; y--) { MAP[y][C-1] = MAP[y-1][C-1]; //arrList.add(new Dust( y, ax, MAP[y][ax])); } //왼쪽 for(int x = C-1; x > ax +1 ; x--) { MAP[ay][x] = MAP[ay][x - 1]; //arrList.add(new Dust( ay, x, MAP[ay][x])); } MAP[ay][ax+ 1] = 0; } } } public static void printMap() { for(int i = 0 ; i < R ; i++) { for(int j = 0 ; j < C ; j++) { System.out.print(MAP[i][j] + " "); } System.out.println(); } } }
'코딩 > 알고리즘' 카테고리의 다른 글
[ 백준 ] [ 자바 ][ 1931 ] 회의실 배정 (0) 2019.06.18 [ 백준 ] [ 자바 ][ 숨박꼭질] 1697 (0) 2019.06.16 5658. [모의 SW 역량테스트] 보물상자 비밀번호 (0) 2019.04.12 [ 백준 ][ 자바][ 16234 ] 인구이동 (0) 2019.04.05 [ 백준 [[ 자바 ][ 6603 ] 로또 (0) 2019.03.23