유블로그

[Java] swea 2382 미생물격리 본문

알고리즘

[Java] swea 2382 미생물격리

yujeong kang 2021. 4. 22. 00:08

[Java] swea 2382 미생물격리

 

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl&categoryId=AV597vbqAH0DFAVl&categoryType=CODE&problemTitle=sw&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=2

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

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

public class 모의SW_2382_미생물격리 {
	static class Microbe {
		int x, y, d, qty;

		public Microbe(int x, int y, int qty, int d) {
			this.x = x;
			this.y = y;
			this.qty = qty;
			this.d = d;
		}
	}
	static int N, M, K;
	static List<Integer>[][] grid;
	static Microbe[] micros;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		int T = Integer.parseInt(br.readLine());
		for (int testcase = 1; testcase <= T; testcase++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			N  = Integer.parseInt(st.nextToken());
			M  = Integer.parseInt(st.nextToken());
			K  = Integer.parseInt(st.nextToken());
			
			micros = new Microbe[K];
			grid = new ArrayList[N][N];
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					grid[i][j] = new ArrayList<>();
				}
			}
			for (int i = 0; i < K; i++) {
				st = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(st.nextToken());
				int y = Integer.parseInt(st.nextToken());
				int qty = Integer.parseInt(st.nextToken());
				int d = Integer.parseInt(st.nextToken());
				switch(d) {
				case 1:
					d = 0;
					break;
				case 4:
					d = 1;
					break;
				}
				micros[i] = new Microbe(x, y, qty, d);
			}
			
			System.out.println("#" + testcase + " " + solve());
		} // tc
	
	} //main

	static int[][] dir = new int[][] { {-1, 0},{0, 1},{1, 0},{0, -1} };
	private static int solve() {
		for (int t = 0; t < M; t++) {
			// 미생물 순회
			for (int i = 0; i < K; i++) {
				if(micros[i].qty == 0) continue;
				micros[i].x += dir[micros[i].d][0];
				micros[i].y += dir[micros[i].d][1];
				if(micros[i].x <= 0 || micros[i].x >= N-1 || micros[i].y <= 0 || micros[i].y >= N-1) {
					micros[i].qty /= 2;
					if(micros[i].qty > 0)
						micros[i].d = (micros[i].d + 2) % 4;
				}
				else {
					grid[micros[i].x][micros[i].y].add(i);
				}
			}
			
			// grid 순회
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					if(grid[i][j].size() > 1) {
						int maxIdx = 0, max = 0, sum = 0;
						for(int num : grid[i][j]) {
							if(max < micros[num].qty) {
								max = micros[num].qty;
								maxIdx = num;
							}
							sum += micros[num].qty;
						}
						
						micros[maxIdx].qty = sum;
						for(int num : grid[i][j]) {
							if(num != maxIdx) {
								micros[num].qty = 0;
							}
						}
					} // if
					grid[i][j].clear();
				} // j
			} // i
			
		} // t
		 
		int cnt = 0;
		for (int i = 0; i < K; i++) {
			if(micros[i].qty > 0) cnt += micros[i].qty;
		}
		
		return cnt;
	} // solve
}

 

문제의 조건을 하나하나 넣으면 된다..

 

List를 가진 이차원 배열을 만든다.

 

시간 M 까지 for 문을 돌리는데

모든 미생물을 순회하면서 이동시킨다. 이 때 약품으로 간 애들은 반을 줄이고 방향을 바꾸는데. 0이 된 애들은 continue로 아무 처리도 하지 않는다. 그리고 이동시킨 그 위치에 List 이차원배열에 미생물 번호를 넣어준다.

 

모든 미생물 순회가 끝나면 List 이차원 배열을 순회한다. size 가 2이상인 것이 있다면 만났다는 뜻이니 그 위치에 있는 미생물 숫자를 다 더한 후 제일 숫자가 큰 애의 미생물 수에 넣어준다. 나머지는 없어진 것이니 0으로 처리한다. 어차피 큰 미생물에 숫자를 넣었으니 방향은 큰 미생물로 자연스럽게 설정된다.

 

중요한 점! 꼭 grid[i][j].clear()로 list를 비워줘야한다. 다음 미생물 이동에 다시 써야하니까~~!

 

위의 작업을 M만큼 반복하고 미생물을 순회하면서 수가 0보다 큰 애들을 다 더해주면 된다.

'알고리즘' 카테고리의 다른 글

[Java] swea 1949 등산로조성  (0) 2021.04.22
[Java] swea 1952 수영장  (0) 2021.04.22
[Java] swea 1953 탈주범검거  (0) 2021.04.21
[Java] swea 2383 점심식사시간  (0) 2021.04.21
[Java] swea 2477 차량정비소  (0) 2021.04.21