17144 미세먼지안녕 - 삼성 sw 역량 테스트 기출

미세먼지 안녕!

R * C 크기의 방안에서,

  1. 미세먼지가 모든 칸에서 동시에 확산된다.

    • 인접한 네 방향으로 확산된다.
    • 인접한 칸에 공기청정기가 있거나 칸이 없으면 확산이 일어나지 않는다.
    • 확산되는 양은 칸마다 (r,c)/5 이고, 소수점은 버린다.
    • 남은 미세먼지 양은 (r,c) - (r,c)/5 * (확산된 방향의 개수) 이다.
  2. 공기청정기가 작동한다.

    • 위쪽 공기청정기는 반시계방향으로 순환하고, 아래쪽은 시계방향으로 순환한다.
    • 미세먼지는 바람의 방향대로 한 칸씩 이동한다.
    • 공기청정기로 들어간 미세먼지는 모두 정화된다.

T초가 지난 후 방에 남아있는 미세먼지의 양은?


입력

이차원 배열에 주어진 입력 값을 입력한다.

공기청정기의 위치는 List<Integer>에 Y좌표만 저장을 한다.

순서대로 입력을 받기 때문에 위쪽 공기청정기의 Y값은 index 0 에 저장되어있고,

X값은 index 1 에 저장되어있다.

구현

  1. 미세먼지의 확산을 구현한다.

    • 델타 배열을 사용하여 인접한 네 방향을 방문할 수 있도록 해준다.
    • 다음 미세먼지의 확산에 영향이 없도록 새로운 이차원 배열 next[][]에 현재 칸이 확산된 결과를 더해준다.
  2. 공기청정기의 바람을 구현한다.

    • 위쪽과 아래쪽을 따로 구현한다.
    • 4개의 for문을 사용해서 방향대로 값을 당겨준다.
    • 마지막에 공기청정기에서 나온 값은 0으로 설정한다.
  3. main 함수에서 T초만큼 1~2를 반복한 후 map에서 0 이상인 값을 더해서 출력한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main미세먼지 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
		R = Integer.parseInt(st1.nextToken());
		C = Integer.parseInt(st1.nextToken());
		int T = Integer.parseInt(st1.nextToken());

		int[][] map = new int[R][C];

		List<Integer> cleaner = new ArrayList<>();

		for(int i = 0; i < R; i++) {
			StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
			for(int j = 0; j < C; j++) {
				map[i][j] = Integer.parseInt(st2.nextToken());
				if(map[i][j]==-1) {
					cleaner.add(i);
				}
			}
		}

		while(T > 0) {

			int[][] next = new int[R][C];

			for(int i = 0; i < R; i++) {
				for(int j = 0; j < C; j++) {
					if (map[i][j]>0) {
						spread(i, j, map, next);
					}
				}
			}
			next[cleaner.get(0)][0] = -1;
			next[cleaner.get(1)][0] = -1;

			map = next;

			cleanTop(cleaner.get(0), map);
			cleanBottom(cleaner.get(1), map);
			T--;
		}


		System.out.println(check(map));

	}

	static int[] dy = {1,-1,0,0};
	static int[] dx = {0,0,-1,1};
	static int R;
	static int C;

	static void spread(int y, int x, int[][] map, int[][] next) {
		int cnt = 0;
		for(int i = 0; i < 4; i++) {
			int yi = y + dy[i];
			int xi = x + dx[i];

			if(yi < 0 || xi < 0 || yi >= R || xi >= C || map[yi][xi] == -1)continue;

			next[yi][xi] += map[y][x]/5;
			cnt++;
		}
		next[y][x]+=map[y][x] - map[y][x]/5 * cnt;
	}

	static void cleanTop(int y, int[][] map) {
		for(int i = y-1; i > 0; i--) {
			map[i][0] = map[i-1][0];
		}
		for(int i = 0; i < C-1; i++) {
			map[0][i] = map[0][i+1];
		}
		for(int i = 0; i < y; i++) {
			map[i][C-1] = map[i+1][C-1];
		}
		for(int i = C-1; i > 1; i--) {
			map[y][i] = map[y][i-1];
		}
		map[y][1] = 0;
	}

	static void cleanBottom(int y, int[][] map) {
		for(int i = y+1; i < R-1; i++) {
			map[i][0] = map[i+1][0];
		}
		for(int i = 0; i < C-1; i++) {
			map[R-1][i] = map[R-1][i+1];
		}
		for(int i = R-1; i > y; i--) {
			map[i][C-1] = map[i-1][C-1];
		}
		for(int i = C-1; i > 1; i--) {
			map[y][i] = map[y][i-1];
		}
		map[y][1] = 0;
	}

	static int check(int[][] map) {
		int sum = 0;
		for(int i = 0; i < R; i++) {
			for(int j = 0; j < C; j++) {
				if(map[i][j] > 0) {
					sum+=map[i][j];
				}
			}
		}
		return sum;
	}
}

태그:

카테고리:

업데이트: