From a356f9e7e71a5916089206f2a908cc03b5f603de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EA=B2=BD=EB=AA=A8?= Date: Fri, 12 Apr 2024 15:43:50 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=94=ED=85=8C=EB=B0=98=204=ED=9A=8C?= =?UTF-8?q?=EC=B0=A8=20=EB=AC=B8=EC=A0=9C=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\260\225\352\262\275\353\252\250.java" | 132 +++++++++++++++++ ...\354\241\260\354\204\261\354\232\260.java" | 2 - ...\353\260\225\352\262\275\353\252\250.java" | 133 ++++++++++++++++++ ...\354\241\260\354\204\261\354\232\260.java" | 2 - ...\353\260\225\352\262\275\353\252\250.java" | 114 +++++++++++++++ ...\354\241\260\354\204\261\354\232\260.java" | 0 ...\353\260\225\352\262\275\353\252\250.java" | 62 ++++++++ ...\354\241\260\354\204\261\354\232\260.java" | 2 - 8 files changed, 441 insertions(+), 6 deletions(-) create mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\353\260\225\352\262\275\353\252\250.java" delete mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\354\241\260\354\204\261\354\232\260.java" create mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260/bj_2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260_\353\260\225\352\262\275\353\252\250.java" delete mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260/bj_2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260_\354\241\260\354\204\261\354\232\260.java" create mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/5427_\353\266\210/bj_5427_\353\266\210_\353\260\225\352\262\275\353\252\250.java" delete mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/5427_\353\266\210/bj_5427_\353\266\210_\354\241\260\354\204\261\354\232\260.java" create mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\353\260\225\352\262\275\353\252\250.java" delete mode 100644 "\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\354\241\260\354\204\261\354\232\260.java" diff --git "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\353\260\225\352\262\275\353\252\250.java" "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\353\260\225\352\262\275\353\252\250.java" new file mode 100644 index 0000000..8805864 --- /dev/null +++ "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\353\260\225\352\262\275\353\252\250.java" @@ -0,0 +1,132 @@ +import java.io.BufferedReader; +//import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; + +public class Main { + + static class Point{ + int y, x; + + public Point(int y, int x) { + super(); + this.y = y; + this.x = x; + } + } + static int[] dy = {0, 0, 1, -1}; + static int[] dx = {1, -1, 0, 0}; + public static void main(String[] args) throws IOException { + //System.setIn(new FileInputStream("input.txt")); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + char[][] map = new char[12][6]; + int ANS = 0; + for(int i=0; i<12; i++) { + String s = br.readLine(); + for(int j=0; j<6; j++) { + map[i][j] = s.charAt(j); + } + } + + while(true) { + // 출력용 +// for(int i= 0; i<12; i++) { +// for(int j=0; j<6; j++) { +// System.out.print(map[i][j] + " "); +// } +// System.out.println(); +// } +// System.out.println(); + int flag = 0; + boolean[][] visited = new boolean[12][6]; + boolean[] toPullDown = new boolean[6]; + + for(int i= 11; i>=0; i--) { // 밑에서부터 탐색 + for(int j=0; j<6; j++) { + if(!visited[i][j] && map[i][j] != '.') { + flag += bfs(map, visited, new Point(i,j), toPullDown); + } + } + } + if(flag == 0) { + break; + }else { + pullDown(map, toPullDown); + ANS++; + } + } + + // 출력용 +// for(int i= 0; i<12; i++) { +// for(int j=0; j<6; j++) { +// System.out.print(map[i][j] + " "); +// } +// System.out.println(); +// } + + System.out.println(ANS); + } + + static int bfs(char[][] map, boolean[][] visited, Point start, boolean[] toPullDown) { + Queue queue = new ArrayDeque<>(); + List toDelList = new ArrayList<>(); + queue.offer(start); + toDelList.add(start); + visited[start.y][start.x] = true; + char initColor = map[start.y][start.x]; + int cnt = 1; + while(!queue.isEmpty()) { + Point temp = queue.poll(); + int cy = temp.y; + int cx = temp.x; + + for(int i=0; i<4; i++) { + int ny = cy + dy[i]; + int nx = cx + dx[i]; + + if(ny<0 || ny>11 || nx<0 || nx>5) + continue; + + if(!visited[ny][nx] && map[ny][nx] == initColor) { + Point nextPoint = new Point(ny, nx); + queue.offer(nextPoint); + toDelList.add(nextPoint); + visited[ny][nx] = true; + cnt++; + } + } + } + // 4개 이상 블럭은 터트리고 끄집어내리기 + if(cnt >=4 ) { + for(Point ob: toDelList) { + map[ob.y][ob.x] = '.'; + toPullDown[ob.x]= true; + } + } + + return cnt>=4 ? 1 : 0; + } + + static void pullDown(char[][] map, boolean[] toPullDown) { + for(int i=0; i<6; i++) { + if(toPullDown[i]) { + for(int ground= 11; ground>=1; ground--) { + for(int j=ground-1; j>=0; j--) { + if(map[ground][i] == '.' && map[j][i] != '.') { + map[ground][i] = map[j][i]; + map[j][i] = '.'; + ground--; + } + + } + } + } + } + } + + +} diff --git "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\354\241\260\354\204\261\354\232\260.java" "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\354\241\260\354\204\261\354\232\260.java" deleted file mode 100644 index 0e48323..0000000 --- "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/11559_PuyoPuyo/bj_11559_PuyoPuyo_\354\241\260\354\204\261\354\232\260.java" +++ /dev/null @@ -1,2 +0,0 @@ -public class bj_11559_PuyoPuyo_조성우 { -} \ No newline at end of file diff --git "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260/bj_2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260_\353\260\225\352\262\275\353\252\250.java" "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260/bj_2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260_\353\260\225\352\262\275\353\252\250.java" new file mode 100644 index 0000000..a3f5c00 --- /dev/null +++ "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260/bj_2146_\353\213\244\353\246\254\353\247\214\353\223\244\352\270\260_\353\260\225\352\262\275\353\252\250.java" @@ -0,0 +1,133 @@ +import java.io.BufferedReader; +//import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Main { + static int N; + static int[] dy = {0, 0, 1, -1}; + static int[] dx = {1, -1, 0, 0}; + static int IDX = 1; // 섬 구분용 IDX + static int MIN = Integer.MAX_VALUE; + static class Node{ + int y, x; + int time; + public Node(int y, int x, int time) { + super(); + this.y = y; + this.x = x; + this.time = time; + } + + } + public static void main(String[] args) throws NumberFormatException, IOException { + //System.setIn(new FileInputStream("input.txt")); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + int[][] map = new int[N][N]; + boolean[][] visited = new boolean[N][N]; + for(int i=0; i queue = new ArrayDeque<>(); + queue.offer(start); + visited[start.y][start.x] = true; + + while(!queue.isEmpty()) { + Node temp = queue.poll(); + int cy = temp.y; + int cx = temp.x; + + map[cy][cx] = IDX; + + for(int i=0; i<4; i++) { + int ny = cy + dy[i]; + int nx = cx + dx[i]; + + if(ny<0|| ny>N-1|| nx<0 || nx>N-1) + continue; + + if(!visited[ny][nx] && map[ny][nx] != 0) { + map[ny][nx] = IDX; + queue.offer(new Node(ny, nx, -1)); + visited[ny][nx] = true; + } + + } + } + + } + + static void bfs2(int[][] map, boolean[][] visited, Node start) { + Queue queue = new ArrayDeque<>(); + visited[start.y][start.x] = true; + queue.offer(start); + int startIdx = map[start.y][start.x]; + + //"BFS는 큐에서 뺀 다음이 아닌, 큐에 넣을 때 방문 체크를 해야 중복 방문이 일어나지 않습니다." + + while(!queue.isEmpty()) { + Node temp = queue.poll(); + int cy = temp.y; + int cx = temp.x; + int ct = temp.time; + + for(int i=0; i<4; i++) { + int ny = cy + dy[i]; + int nx = cx + dx[i]; + + if(ny<0|| ny>N-1|| nx<0 || nx>N-1) + continue; + + if(map[ny][nx] !=0 && map[ny][nx] != startIdx) { + MIN = ct fireQueue = new ArrayDeque<>(); + + for(int i=0; i fireQueue) { + Queue queue = new ArrayDeque<>(); + queue.offer(start); + + while(!queue.isEmpty()) { + int fireIter = fireQueue.size(); + for(int i=0; i h-1 || fnx<0 || fnx >w-1) + continue; + + if(map[fny][fnx] == '.' || map[fny][fnx] == '@') { + map[fny][fnx] = '*'; + fireQueue.offer(new Node(fny, fnx, -1)); + } + } + } + + int iter = queue.size(); + for(int k=0; kh-1 || nx<0 || nx>w-1) { + return temp.time + 1; + } + + if(!visited[ny][nx] && map[ny][nx] == '.') { + map[ny][nx] = '@'; + queue.offer(new Node(ny, nx, ct+1)); + } + } + } + + } + return -1; + } +} diff --git "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/5427_\353\266\210/bj_5427_\353\266\210_\354\241\260\354\204\261\354\232\260.java" "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/5427_\353\266\210/bj_5427_\353\266\210_\354\241\260\354\204\261\354\232\260.java" deleted file mode 100644 index e69de29..0000000 diff --git "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\353\260\225\352\262\275\353\252\250.java" "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\353\260\225\352\262\275\353\252\250.java" new file mode 100644 index 0000000..4aa8474 --- /dev/null +++ "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\353\260\225\352\262\275\353\252\250.java" @@ -0,0 +1,62 @@ +import java.io.BufferedReader; +//import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + static int[] graph; + static int n, connected; + static boolean[] visited, done; // 팀을 고른 학생들 + + public static void main(String[] args) throws NumberFormatException, IOException { + //System.setIn(new FileInputStream("input.txt")); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int T = Integer.parseInt(br.readLine()); + StringBuilder sb = new StringBuilder(); + for(int tc=1; tc<=T; tc++) { + n = Integer.parseInt(br.readLine()); + graph = new int[n+1]; + connected = 0; + + visited = new boolean[n+1]; + done = new boolean[n+1]; // 팀 구성 끝난 노드들 + StringTokenizer st = new StringTokenizer(br.readLine()); + + for(int i=1; i<=n; i++) { + graph[i] = Integer.parseInt(st.nextToken()); + if(i == graph[i]) { + connected++; + done[i] = true; + } + } + + for(int i=1; i<=n; i++) { + if(!done[i]) { + dfs(i); + } + } + + sb.append(n - connected + "\n"); + } + System.out.println(sb); + } + + static void dfs(int node) { + if(visited[node]) { + done[node] = true; + connected++; + }else { + visited[node] = true; + } + + if(!done[graph[node]]) { + dfs(graph[node]); + } + visited[node] = false; + done[node] = true; + } + + + +} diff --git "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\354\241\260\354\204\261\354\232\260.java" "b/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\354\241\260\354\204\261\354\232\260.java" deleted file mode 100644 index 90d238b..0000000 --- "a/\354\275\224\355\205\214\353\260\230/4\355\232\214\354\260\250/9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270/bj_9466_\355\205\200\355\224\204\353\241\234\354\240\235\355\212\270_\354\241\260\354\204\261\354\232\260.java" +++ /dev/null @@ -1,2 +0,0 @@ -public class bj_9466_텀프로젝트_조성우 { -} \ No newline at end of file