상세 컨텐츠

본문 제목

[SWEA] 미생물격리

💯ProblemSolving/문제 풀이-Java

by :부셔져버린개발자 2024. 11. 16. 13:53

본문

       문제 요약        

- 문제

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl

 

- 입출력

 

 

         아이디어        

 

구현 

움직이고 (다른 box만들어서)

겹치는 좌표의 모든 미생물을 zip 하는 작업 진행 (이때 new ArrayList<>()로 덮어써서 괜찮음)

 

         소스코드        

 

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

public class Main {
	static int T;
	static int N, M, K; // 셀의 개수, 격리 시간, 미생물 군집의 개수
	// 상 하 좌 우
	static int[][] way = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
	static List<int[]> items;
	static List<Item>[][] box;

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("src/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		T = Integer.parseInt(br.readLine());
		for (int t = 1; t <= T; t++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken()); // 셀의 개수
			M = Integer.parseInt(st.nextToken()); // 격리 시간

			box = create();
			items = new ArrayList<>();
			K = Integer.parseInt(st.nextToken()); // 미생물 군집의 수
			for (int k = 1; k <= K; k++) {
				st = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(st.nextToken()); // 세로
				int y = Integer.parseInt(st.nextToken()); // 가로
				int cnt = Integer.parseInt(st.nextToken()); // 수
				int dir = Integer.parseInt(st.nextToken()) - 1; // 방향
				items.add(new int[] { x, y });
				box[x][y].add(new Item(cnt, way[dir][0], way[dir][1]));
			}

			for (int m = 0; m < M; m++) {
				box = move(); // items move
				zipAndDistroy(); // 절반 죽고, 이동 방향 반대로 바뀜
			}

			int cnt = 0;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					for (Item item : box[i][j]) {
						cnt += item.cnt;
					}
				}
			}
			System.out.println("#" + t + " " + cnt);
		}

	}

	static List<Item>[][] move() {
		List<Item>[][] next = create();
		for (int i = 0; i < items.size(); i++) {
			int[] now = items.get(i); // 여기서 이동
			int nx = now[0] + box[now[0]][now[1]].get(0).dx;
			int ny = now[1] + box[now[0]][now[1]].get(0).dy;
			next[nx][ny].addAll(box[now[0]][now[1]]);
		}
		return next;
	}

	static void zipAndDistroy() {
		items = new ArrayList<>();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				List<Item> cur = new ArrayList<>();
				// 하나로 만들기 위한 작업
				int allCnt = 0;
				int dx = 0, dy = 0;
				int maxCnt = 0;
				for (int c = 0; c < box[i][j].size(); c++) {
					Item item = box[i][j].get(c);
					if (maxCnt < item.cnt) {
						maxCnt = item.cnt;
						dx = item.dx;
						dy = item.dy;
					}
					allCnt += item.cnt;
				}

				// 경계에 있다면 처리
				if (i == 0 || i == N - 1 || j == 0 || j == N - 1) {
					allCnt /= 2;
					dx = -1 * dx;
					dy = -1 * dy;
				}

				if (allCnt > 0) {
					Item zipped = new Item(allCnt, dx, dy);
					cur.add(zipped);
					items.add(new int[] { i, j });
				}

				box[i][j] = cur;

			}
		}
	}

	static List<Item>[][] create() {
		List<Item>[][] next = new ArrayList[N][N];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				next[i][j] = new ArrayList<>();
			}
		}
		return next;
	}

	static class Item {
		int cnt, dx, dy;

		Item(int cnt, int dx, int dy) {
			this.cnt = cnt;
			this.dx = dx;
			this.dy = dy;
		}

	}

	static void print() {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				System.out.print(box[i][j].size());
			}
			System.out.println();
		}
		System.out.println();
	}

}



 

728x90

'💯ProblemSolving > 문제 풀이-Java' 카테고리의 다른 글

[LeetCode] 21. Merge Two Sorted List  (0) 2024.11.20
[BJ] 1922 : 네트워크 연결  (0) 2024.11.20
[BJ] 2251 : 물통  (0) 2024.11.15
[BJ] 1561 : 놀이공원  (0) 2024.11.14
[BJ] 2110 : 공유기 설치  (0) 2024.11.14

관련글 더보기