From 44d1aaff2d32a69b1e9cc3eab06d5b89ac2f595a Mon Sep 17 00:00:00 2001 From: Dajeong Choe Date: Tue, 8 Aug 2023 19:30:19 +0900 Subject: [PATCH] Baekjoon #21609 --- .../bin/Samsung/Problem21609.class | Bin 0 -> 4920 bytes .../src/Samsung/Problem21609.java | 313 ++++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100644 CodingTestStudy1.0/bin/Samsung/Problem21609.class create mode 100644 CodingTestStudy1.0/src/Samsung/Problem21609.java diff --git a/CodingTestStudy1.0/bin/Samsung/Problem21609.class b/CodingTestStudy1.0/bin/Samsung/Problem21609.class new file mode 100644 index 0000000000000000000000000000000000000000..02d61bb917811760470eb56e9e1072f11aa344af GIT binary patch literal 4920 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 literal 0 HcmV?d00001 diff --git a/CodingTestStudy1.0/src/Samsung/Problem21609.java b/CodingTestStudy1.0/src/Samsung/Problem21609.java new file mode 100644 index 0000000..a5bdf2b --- /dev/null +++ b/CodingTestStudy1.0/src/Samsung/Problem21609.java @@ -0,0 +1,313 @@ +package Samsung; + +import java.io.*; +import java.util.*; + +public class Problem21609 { + + static int N, M; + static int[][] map; + static boolean[][] vis; + static int score = 0; + + static Queue q = new LinkedList<>(); + static int[][] dir = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer str = new StringTokenizer(br.readLine(), " "); + + N = Integer.parseInt(str.nextToken()); + M = Integer.parseInt(str.nextToken()); + + map = new int[N][N]; + + for (int i = 0; i < N; i++) { + str = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + map[i][j] = Integer.parseInt(str.nextToken()); + } + } + + while (true) { + + // 가장 큰 블록 그룹 찾기 + Block resBlock = findBlockFunc(); + + // 더이상 블록 그룹이 존재하지 않으면 종료 + if (resBlock == null) { + break; + } + + // 점수 계산 + score += resBlock.sum * resBlock.sum; + + // 블록 그룹 제거 + removeFunc(resBlock); + + // 중력 작용 + gravityFunc(); + + // 회전 + rotateFunc(); + + // 중력 작용 + gravityFunc(); + + } + + System.out.println(score); + + } + + // 크기가 가장 큰 블록 그룹 찾는 함수 + static Block findBlockFunc() { + vis = new boolean[N][N]; + Block maxBlock = new Block(0, 0, 0, Integer.MIN_VALUE, Integer.MIN_VALUE); + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + + // 검정 블록이면 SKIP + if (map[i][j] == -1) { + continue; + } + + // 빈칸이면 SKIP + if (map[i][j] == -2) { + continue; + } + + // 무지개 블록이면 SKIP + if (map[i][j] == 0) { + continue; + } + if (vis[i][j]) { + continue; + } + + // 블록 그룹 탐색 전에 무지개 블록 방문 처리 초기화 + initRainbowFunc(); + + // 블록 그룹 탐색 BFS + // color의 번호, 기준 색상의 위치 (i,j)를 들고 이동 + Block cur = bfsFunc(i, j, map[i][j]); + + // 블록 그룹의 크기가 2보다 작으면 SKIP + if (cur == null) { + continue; + } + + // 가장 큰 블록 그룹 찾기 + if (maxBlock.compareBlock(cur)) { + maxBlock = cur; + } + } + } + + // 블록 그룹을 찾지 못한 경우 NULL 리턴 + if (maxBlock.color == 0) { + return null; + } + + return maxBlock; + + } + + // 무지개 블록 방문 처리 초기화 함수 + static void initRainbowFunc() { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (map[i][j] == 0) { + vis[i][j] = false; + } + } + } + } + + static Block bfsFunc(int x, int y, int color) { + q.add(new int[] { x, y }); + vis[x][y] = true; + int sum = 1; // 블록 그룹의 크기 + int rs = 0; // 블록 그룹에 포함된 무지개 블록의 개수 + + while (!q.isEmpty()) { + int[] cur = q.poll(); + int cx = cur[0]; + int cy = cur[1]; + + for (int i = 0; i < 4; i++) { + int nx = cx + dir[i][0]; + int ny = cy + dir[i][1]; + + if (nx < 0 || nx >= N || ny < 0 || ny >= N) { + continue; + } + + if (map[nx][ny] == -1) { + continue; + } + + if (map[nx][ny] == -2) { + continue; + } + + if (vis[nx][ny]) { + continue; + } + + // color가 다를 때 무지개 블록이면 블록 그룹에 추가 + if (map[nx][ny] != color) { + if (map[nx][ny] == 0) { + rs++; + sum++; + vis[nx][ny] = true; + q.add(new int[] { nx, ny }); + } + continue; + } + + // 위 조건에 모두 포함되지 않으면 + sum++; + vis[nx][ny] = true; + q.add(new int[] { nx, ny }); + + } + + } + + if (sum < 2) { + return null; + } else { + return new Block(x, y, color, sum, rs); + } + + } + + // 블록 그룹을 제거하는 함수 + static void removeFunc(Block block) { + vis = new boolean[N][N]; + vis[block.x][block.y] = true; + map[block.x][block.y] = -2; + q.add(new int[] { block.x, block.y }); + + while (!q.isEmpty()) { + int[] cur = q.poll(); + int cx = cur[0]; + int cy = cur[1]; + + for (int i = 0; i < 4; i++) { + int nx = cx + dir[i][0]; + int ny = cy + dir[i][1]; + + if (nx < 0 || nx >= N || ny < 0 || ny >= N) { + continue; + } + + if (map[nx][ny] == -1) { + continue; + } + + if (map[nx][ny] == -2) { + continue; + } + + if (vis[nx][ny]) { + continue; + } + + // color가 다른 것 중에 무지개인 경우 제거 + if (map[nx][ny] != block.color) { + if (map[nx][ny] == 0) { + q.add(new int[] { nx, ny }); + vis[nx][ny] = true; + map[nx][ny] = -2; + } + continue; + } + + // 위 조건에 모두 포함되지 않으면 + // 블록그룹 제거 (-2) + q.add(new int[] { nx, ny }); + vis[nx][ny] = true; + map[nx][ny] = -2; + } + } + } + + // 중력 작용 함수 + static void gravityFunc() { + for (int i = 0; i < N; ++i) { + // 가장 아래에서(N-1) 바로 윗 칸(N-1)에서 시작 + for (int j = N - 2; j >= 0; --j) { + if (map[j][i] == -1) { + continue; + } + if (map[j][i] == -2) { + continue; + } + + int dest = j + 1; + while (true) { + if (dest == N) + break; + if (map[dest][i] == -2) + dest++; + else + break; + } + if (dest == j + 1) + continue; + map[dest - 1][i] = map[j][i]; + map[j][i] = -2; + } + } + } + + // 90도 회전 함수 + static void rotateFunc() { + int[][] temp = new int[N][N]; + + int x = 0; + int y = 0; + for (int j = N - 1; j >= 0; j--, x++) { + y = 0; + for (int i = 0; i < N; i++, y++) { + temp[x][y] = map[i][j]; + } + } + + map = temp; + } + + static class Block { + int x, y, color, sum, rs; + + public Block(int x, int y, int color, int sum, int rs) { + this.x = x; + this.y = y; + this.color = color; + this.sum = sum; + this.rs = rs; + } + + // 블록 그룹 비교 함수 + public boolean compareBlock(Block other) { + // other가 더 크면 TRUE + + if (this.sum != other.sum) { + return this.sum < other.sum; + } + + if (this.rs != other.rs) { + return this.rs < other.rs; + } + + if (this.x != other.x) { + return this.x < other.x; + } + + return this.y < other.y; + } + } +}