From 349812c1fa6e64f39675e75571e16adeca798260 Mon Sep 17 00:00:00 2001 From: nnindd <62933478+nnindd@users.noreply.github.com> Date: Mon, 29 Aug 2022 18:08:24 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[BOJ]=20=EC=95=88=EC=A0=84=EC=98=81?= =?UTF-8?q?=EC=97=AD=20/=20=EC=8B=A4=EB=B2=841=20/=201=EC=8B=9C=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\240\204\354\230\201\354\227\255.java" | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 "dongju/BOJ/Main_2468_\354\225\210\354\240\204\354\230\201\354\227\255.java" diff --git "a/dongju/BOJ/Main_2468_\354\225\210\354\240\204\354\230\201\354\227\255.java" "b/dongju/BOJ/Main_2468_\354\225\210\354\240\204\354\230\201\354\227\255.java" new file mode 100644 index 0000000..5aff3de --- /dev/null +++ "b/dongju/BOJ/Main_2468_\354\225\210\354\240\204\354\230\201\354\227\255.java" @@ -0,0 +1,102 @@ +package boj; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main_2468_안전영역 { + // (1) 비 내리는 양은 1부터 최대높이만큼 설정 + // (2) 비 내리는 양만큼 잠기는 복사배열 설정 + // (3) dfs로 인접영역 조사 + // (4) 최대영역 설정 + + static int N, maxH = 0, res = Integer.MIN_VALUE; //영역크기, 최대높이, 결과값 + static int[][] map; //원본배열 + static int[][] copy; //연산에 사용할 복사배열 + static boolean[][] visited; //방문체크 + + static int[] dr = { -1, 1, 0, 0 }; //4방탐색 + static int[] dc = { 0, 0, -1, 1 }; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + map = new int[N][N]; + + for (int i = 0; i < N; i++) { + StringTokenizer tokens = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + map[i][j] = Integer.parseInt(tokens.nextToken()); + if (map[i][j] > maxH) { + maxH = map[i][j]; // 최대 높이 설정 + } + } + } // 입력완료 + + + // 0부터 최대높이까지 영역 조사 + for (int i = 0; i <= maxH; i++) { + + int area = 0; //구역 초기화 + + copyMap(); // 높이 조사할때마다 새로 배열 복사해줌 + + notSafe(i); // 잠긴 영역을 0으로 만듦 + + visited = new boolean[N][N]; // 방문체크 배열 + + for(int x=0; x= 0 && nx < N && ny >= 0 && ny < N) { // 해당 범위 내에 있음 + if (!visited[nx][ny] && copy[nx][ny] != 0) { // 방문하지 않았고 갈 수 있음 + dfs(nx, ny); //다음 위치 조사 + } + } + } + } + + private static void notSafe(int h) { //물에 잠긴 영역 + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (copy[i][j] <= h) { + copy[i][j] = 0; // 잠긴 지역은 0으로 만들어줌 + } + } + } + } + + private static void copyMap() { //원본 배열 복사 + copy = new int[N][N]; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + copy[i][j] = map[i][j]; + } + } + } + +} From 1b6387d90e221acd982fad3983a154befb716de0 Mon Sep 17 00:00:00 2001 From: nnindd <62933478+nnindd@users.noreply.github.com> Date: Mon, 29 Aug 2022 18:09:41 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[BOJ]=20=EC=97=B0=EC=82=B0=EC=9E=90=20?= =?UTF-8?q?=EB=81=BC=EC=9B=8C=EB=84=A3=EA=B8=B0=20/=20=EC=8B=A4=EB=B2=841?= =?UTF-8?q?=20/=202=EC=8B=9C=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\233\214\353\204\243\352\270\260.java" | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 "dongju/BOJ/Main_14888_\354\227\260\354\202\260\354\236\220\353\201\274\354\233\214\353\204\243\352\270\260.java" diff --git "a/dongju/BOJ/Main_14888_\354\227\260\354\202\260\354\236\220\353\201\274\354\233\214\353\204\243\352\270\260.java" "b/dongju/BOJ/Main_14888_\354\227\260\354\202\260\354\236\220\353\201\274\354\233\214\353\204\243\352\270\260.java" new file mode 100644 index 0000000..741af0d --- /dev/null +++ "b/dongju/BOJ/Main_14888_\354\227\260\354\202\260\354\236\220\353\201\274\354\233\214\353\204\243\352\270\260.java" @@ -0,0 +1,69 @@ +package boj; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main_14888_연산자끼워넣기 { + + static int N, max, min; + static int[] oper; + static int[] numbers; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); //수의 개수 + + numbers = new int[N]; //수 순서 저장 배열 + StringTokenizer tokens = new StringTokenizer(br.readLine()); + for(int i=0; i0) { //0보다 클때만 연산 + oper[i]--; + + switch (i) { //연산자를 순서대로 줄여주면서 선택하게함. + case 0: + recur(res + numbers[idx], idx+1); + break; + case 1: + recur(res - numbers[idx], idx+1); + break; + case 2: + recur(res * numbers[idx], idx+1); + break; + case 3: + recur(res / numbers[idx], idx+1); + break; + } + oper[i]++; + } + } + } +} From 715cc4d9a9ccd8a5b6426324c991dbbc1c0545b4 Mon Sep 17 00:00:00 2001 From: nnindd <62933478+nnindd@users.noreply.github.com> Date: Mon, 29 Aug 2022 18:10:27 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[BOJ]=20=EC=8A=A4=ED=83=80=ED=8A=B8?= =?UTF-8?q?=EC=99=80=20=EB=A7=81=ED=81=AC=20/=20=EC=8B=A4=EB=B2=842=20/=20?= =?UTF-8?q?1=EC=8B=9C=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\231\200\353\247\201\355\201\254.java" | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 "dongju/BOJ/Main_14889_\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.java" diff --git "a/dongju/BOJ/Main_14889_\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.java" "b/dongju/BOJ/Main_14889_\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.java" new file mode 100644 index 0000000..a7d75d0 --- /dev/null +++ "b/dongju/BOJ/Main_14889_\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.java" @@ -0,0 +1,67 @@ +package boj; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main_14889_스타트와링크 { + + static int N, res; + static int[][] map; + + public static void main(String[] args) throws Exception { + // 조합 구하고 앞의 true 한팀 false 2개 한팀 + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + + map = new int[N][N]; + + for (int i = 0; i < N; i++) { + StringTokenizer tokens = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + map[i][j] = Integer.parseInt(tokens.nextToken()); + } + } + + res = Integer.MAX_VALUE; + + comb(0, 0, new boolean[N]); + + System.out.println(res); + } + + private static void comb(int cnt, int prev, boolean[] v) { + if (cnt == N / 2) { + int sub = getMinimum(v); + res = Math.min(res, sub); + return; + } + + for (int i = prev; i < N; i++) { + if (!v[i]) { + v[i] = true; + comb(cnt + 1, i+1, v); + v[i] = false; + } + } + } + + private static int getMinimum(boolean[] v) { + int start = 0; + int link = 0; + for(int i=0; i Date: Mon, 29 Aug 2022 18:11:30 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[BOJ]=20=EB=8B=A8=EC=A7=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=B6=99=EC=9D=B4=EA=B8=B0=20/=20=EC=8B=A4=EB=B2=841?= =?UTF-8?q?=20/=201=EC=8B=9C=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\266\231\354\235\264\352\270\260.java" | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 "dongju/BOJ/Main_2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.java" diff --git "a/dongju/BOJ/Main_2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.java" "b/dongju/BOJ/Main_2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.java" new file mode 100644 index 0000000..9e591cb --- /dev/null +++ "b/dongju/BOJ/Main_2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.java" @@ -0,0 +1,99 @@ +package boj; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.Queue; + +public class Main_2667_단지번호붙이기 { + + // 인접한 곳 끼리 하나의 단지로 만든다 + // =>한곳을 지정해서 더이상 방문할곳이 없을 때까지 자식들을 넣음. 큐에서 뺀 횟수로 진행 + // 단지에 속하는 집의 개수를 구한다 + // 오름차순으로 정렬한다 + + static int N, total; + static int[][] map; + static int[] dr = { -1, 1, 0, 0 }; + static int[] dc = { 0, 0, -1, 1 }; + static ArrayList danji; // 단지의 갯수를 오름차순으로 정렬할 리스트 + + static class Point { + int x, y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + + map = new int[N][N]; + + for (int i = 0; i < N; i++) { + String temp = br.readLine(); + for (int j = 0; j < N; j++) { + map[i][j] = temp.charAt(j) - '0'; + } + } + // 입력 끝 + + danji = new ArrayList<>(); + boolean[][] v = new boolean[N][N]; + total = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if(map[i][j]==1 && !v[i][j]) { //continue로 처리하지 말고 해당 부분만 처리할 수 있도록 해야함. 여기서 계속 틀렸다 + bfs(i, j, v); + total++; + } + } + } + + System.out.println(total); + + Collections.sort(danji); + + for (int i : danji) { + System.out.println(i); + } + + } + + private static void bfs(int x, int y, boolean[][] v) { + Queue queue = new LinkedList<>(); + queue.add(new Point(x, y)); + int cnt = 1; + v[x][y] = true; + + while (!queue.isEmpty()) { + Point cur = queue.poll(); // 현재 위치 뽑아옴 + + for (int d = 0; d < 4; d++) { + int nx = cur.x + dr[d]; + int ny = cur.y + dc[d]; + + if (nx >= 0 && ny >= 0 && nx < N && ny < N) { + if (map[nx][ny] == 1 && !v[nx][ny]) { + // 범위내에 있고 집이 존재하고 방문하지 않았다면 + v[nx][ny] = true; // 방문처리 + queue.add(new Point(nx, ny)); // 새로 넣어줌 + cnt++; // 큐에서 뽑은 만큼 연결된 단지 + } + + } + } + } + + danji.add(cnt); + } +} From 2f2c93f3df1342af17efd8512ac8abe3789b262e Mon Sep 17 00:00:00 2001 From: nnindd <62933478+nnindd@users.noreply.github.com> Date: Mon, 29 Aug 2022 18:12:32 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[BOJ]=20=EC=88=AB=EC=9E=90=EA=B3=A0?= =?UTF-8?q?=EB=A5=B4=EA=B8=B0=20/=20=EA=B3=A8=EB=93=9C5=20/=201=EC=8B=9C?= =?UTF-8?q?=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\352\263\240\353\245\264\352\270\260.java" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 "dongju/BOJ/Main_2668_\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" diff --git "a/dongju/BOJ/Main_2668_\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" "b/dongju/BOJ/Main_2668_\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" new file mode 100644 index 0000000..aaf296c --- /dev/null +++ "b/dongju/BOJ/Main_2668_\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" @@ -0,0 +1,56 @@ +package boj; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; + +public class Main_2668_숫자고르기 { + + static int N, index; + static int[] arr; + static int[] result; + static boolean[] check; + static ArrayList list; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine())+1; + arr = new int[N]; + check = new boolean[N]; + + for(int i=1; i(); + + for(int i=1; i Date: Mon, 29 Aug 2022 18:13:55 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[BOJ]=20=EC=8B=AD=EC=9E=90=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EB=AC=B8=EC=A0=9C=20/=20=EC=8B=A4=EB=B2=843=20/=20?= =?UTF-8?q?1=EC=8B=9C=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\223\234\353\254\270\354\240\234.java" | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 "dongju/BOJ/Main_2659_\354\213\255\354\236\220\354\271\264\353\223\234\353\254\270\354\240\234.java" diff --git "a/dongju/BOJ/Main_2659_\354\213\255\354\236\220\354\271\264\353\223\234\353\254\270\354\240\234.java" "b/dongju/BOJ/Main_2659_\354\213\255\354\236\220\354\271\264\353\223\234\353\254\270\354\240\234.java" new file mode 100644 index 0000000..2664119 --- /dev/null +++ "b/dongju/BOJ/Main_2659_\354\213\255\354\236\220\354\271\264\353\223\234\353\254\270\354\240\234.java" @@ -0,0 +1,60 @@ +package boj; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.StringTokenizer; + +public class Main_2659_십자카드문제 { + + static boolean[] v; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer tokens = new StringTokenizer(br.readLine()); + + int[] temp = new int[4]; + for(int i=0; i<4; i++) { + temp[i] = Integer.parseInt(tokens.nextToken()); + } + + int min = setMinimum(temp[0], temp[1], temp[2], temp[3]); // 가장 작은 시계수 + + setClockNum(); // 있는 시계수를 다 구함. 시계수가 가능한 인덱스는 true로 설정 + int cnt = 0; + for (int i = 1111; i <= min; i++) { + if (v[i]) + cnt++; + } + System.out.println(cnt); + + } + + private static void setClockNum() { //전체 시계수 다 구하기 + v = new boolean[10000]; // 9999최대시계수 + for (int a = 1; a < 10; a++) { + for (int b = 1; b < 10; b++) { + for (int c = 1; c < 10; c++) { + for (int d = 1; d < 10; d++) { + int num = setMinimum(a, b, c, d); + + if (!v[num]) //시계수로 만들수 있는 숫자의 인덱스만 true로 바꿔줌 + v[num] = true; // 시계수 가능 + } + } + } + } + } + + private static int setMinimum(int a, int b, int c, int d) { //주어진 4글자 중에서 최소 시계수 구하기 + int min = Integer.MAX_VALUE; + + min = Math.min(min, a * 1000 + b * 100 + c * 10 + d); + min = Math.min(min, b * 1000 + c * 100 + d * 10 + a); + min = Math.min(min, c * 1000 + d * 100 + a * 10 + b); + min = Math.min(min, d * 1000 + a * 100 + b * 10 + c); + + return min; + } +} From f69a2b812b529ed0f2449fc90b7743a5552f777d Mon Sep 17 00:00:00 2001 From: nnindd <62933478+nnindd@users.noreply.github.com> Date: Sat, 10 Sep 2022 18:20:46 +0900 Subject: [PATCH 7/8] =?UTF-8?q?[BOJ]=202048=20(Easy)=20/=20=EA=B3=A8?= =?UTF-8?q?=EB=93=9C2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dongju/BOJ/Main_12100_2048easy.java | 206 ++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 dongju/BOJ/Main_12100_2048easy.java diff --git a/dongju/BOJ/Main_12100_2048easy.java b/dongju/BOJ/Main_12100_2048easy.java new file mode 100644 index 0000000..9866852 --- /dev/null +++ b/dongju/BOJ/Main_12100_2048easy.java @@ -0,0 +1,206 @@ +package BOJ; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main_12100_2048easy { + static int N, max; + static int[][] map, copy; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + + map = new int[N][N]; + copy = new int[N][N]; + + max = Integer.MIN_VALUE; + + for (int i = 0; i < N; i++) { + StringTokenizer tokens = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + map[i][j] = Integer.parseInt(tokens.nextToken()); + copy[i][j] = map[i][j]; + max = Math.max(max, map[i][j]); //초기 최대값은 맵에서 가장 큰 값 + } + } + + perm(0, new int[5]); + + System.out.println(max); + } + + private static void perm(int cnt, int[] order) {//상하좌우 움직일 순서를 정함. 중복순열 + if (cnt == 5) { + //순서대로 이동하기 + for (int d = 0; d < 5; d++) { + move(order[d]); //이동 순서에 따라 이동 + } + + //카피배열을 처음 상태로 돌려줌 + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + copy[i][j] = map[i][j]; + } + } + return; + } + + for (int i = 0; i < 4; i++) { + //상하좌우 움직일 순서를 정함 + order[cnt] = i; + perm(cnt + 1, order); + } + } + + private static void move(int d) { + //아래같은 경우 공백 없게 붙여준 다음 같은 값을 합쳐줘야함 그리고 다시 0없게 붙여줌 + //2 2 4 + //0 0 4 + //2 2 4 + + //붙여줌 값 합침 붙여줌 + //2 2 4 4 4 8 4 4 8 + //2 2 4 => 0 0 0 => 0 0 4 + //0 0 4 0 0 4 0 0 0 + + //공백없이 붙여주는 메서드 + noZero(d); + + //방향대로 값을 합치기 위한 부분 + switch (d) { + case 0: //위로 움직임 + //열로 탐색, 시작 인덱스는 0~N + for (int j = 0; j < N; j++) {//한 열씩 진행 + for (int i = 0; i < N - 1; i++) {//첫번째부터 n-1까지 선택 + if (copy[i][j] == copy[i + 1][j]) { //첫번째와 두번째가 같으면 합쳐주고 두번째를 비워줌 + copy[i][j] += copy[i + 1][j]; + copy[i + 1][j] = 0; + } + } + } + break; + + case 1: //아래로 움직임 + //열로 탐색 + for (int j = 0; j < N; j++) {//한 열씩 값 수정 + for (int i = N - 1; i > 0; i--) {//행 시작 인덱스는 N~0 + if (copy[i][j] == copy[i - 1][j]) { + copy[i][j] += copy[i - 1][j]; + copy[i - 1][j] = 0; + } + } + } + break; + + case 2: //좌로 움직임 + //행으로 탐색 + for (int i = 0; i < N; i++) {//한 행씩 값 수정 + for (int j = 0; j < N - 1; j++) {//시작 인덱스는 0~N + if (copy[i][j] == copy[i][j + 1]) { + copy[i][j] += copy[i][j + 1]; + copy[i][j + 1] = 0; + } + } + } + break; + + case 3: //우로 움직임 + //열로 탐색 + for (int i = 0; i < N; i++) { + for (int j = N - 1; j > 0; j--) {//행 시작 인덱스는 N~0 + if (copy[i][j] == copy[i][j - 1]) { + copy[i][j] += copy[i][j - 1]; + copy[i][j - 1] = 0; + } + } + } + break; + } + + //다시 공백 없게 붙여줌 + noZero(d); + + //한번 움직일때마다 최대값 찾음 + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + max = Math.max(max, copy[i][j]); + } + } + } + + private static void noZero(int d) { + switch (d) { + case 0://위로 움직임 + for (int j = 0; j < N; j++) {//한 열씩 값 수정 + for (int i = 0; i < N - 1; i++) {//행의 0부터 N까지 첫번째 인덱스 정함 + int idx = i + 1; //i의 다음 인덱스 + if (copy[i][j] == 0) {//첫번째 인덱스가 0이라면 다음이 0이 아닐때까지 검사 + while (idx < N) { //배열 범위를 벗어나지 않을 때까지 반복 + if (copy[idx][j] != 0) { //0이 아니라면 0인 첫부분에 값 옮김 + copy[i][j] = copy[idx][j]; + copy[idx][j] = 0; + break; + } + idx++; //0이라면 다음 검색을 위해 인덱스 증가 + } + } + } + } + break; + case 1: + for (int j = 0; j < N; j++) {//한 열씩 값 수정 + for (int i = N - 1; i > 0; i--) { + int idx = i - 1; + if (copy[i][j] == 0) {//0이라면 다음이 0이 아닐때까지 검사해야함 + while (idx >= 0) { + if (copy[idx][j] != 0) { + copy[i][j] = copy[idx][j]; + copy[idx][j] = 0; + break; + } + idx--; + } + } + } + } + break; + case 2: + for (int i = 0; i < N; i++) {//한 열씩 값 수정 + for (int j = 0; j < N - 1; j++) { + int idx = j + 1; + if (copy[i][j] == 0) { + while (idx < N) { + if (copy[i][idx] != 0) { + copy[i][j] = copy[i][idx]; + copy[i][idx] = 0; + break; + } + idx++; + } + } + } + } + break; + case 3: + for (int i = 0; i < N; i++) {//한 열씩 값 수정 + for (int j = N - 1; j > 0; j--) { + int idx = j - 1; + if (copy[i][j] == 0) { + while (idx >= 0) { + if (copy[i][idx] != 0) { + copy[i][j] = copy[i][idx]; + copy[i][idx] = 0; + break; + } + idx--; + } + } + } + } + break; + } + } +} From 2627369c2de6d2046d1f560fd07f85607270b1cb Mon Sep 17 00:00:00 2001 From: nnindd <62933478+nnindd@users.noreply.github.com> Date: Sat, 10 Sep 2022 18:21:15 +0900 Subject: [PATCH 8/8] =?UTF-8?q?[BOJ]=20=EA=B5=AC=EC=8A=AC=20=ED=83=88?= =?UTF-8?q?=EC=B6=9C=202=20/=20=EA=B3=A8=EB=93=9C1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...341\204\216\341\205\256\341\206\2572.java" | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 "dongju/BOJ/Main_13460_\341\204\200\341\205\256\341\204\211\341\205\263\341\206\257\341\204\220\341\205\241\341\206\257\341\204\216\341\205\256\341\206\2572.java" diff --git "a/dongju/BOJ/Main_13460_\341\204\200\341\205\256\341\204\211\341\205\263\341\206\257\341\204\220\341\205\241\341\206\257\341\204\216\341\205\256\341\206\2572.java" "b/dongju/BOJ/Main_13460_\341\204\200\341\205\256\341\204\211\341\205\263\341\206\257\341\204\220\341\205\241\341\206\257\341\204\216\341\205\256\341\206\2572.java" new file mode 100644 index 0000000..2880e09 --- /dev/null +++ "b/dongju/BOJ/Main_13460_\341\204\200\341\205\256\341\204\211\341\205\263\341\206\257\341\204\220\341\205\241\341\206\257\341\204\216\341\205\256\341\206\2572.java" @@ -0,0 +1,155 @@ +package BOJ; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Main_13460_구슬탈출2 { + + static int N, M; //배열 크기 + static char[][] map; + static Point pos; //처음 빨간구슬, 파란구슬 저장할 위치 + + static int[] dr = {-1, 1, 0, 0}; //상하좌우 이동 + static int[] dc = {0, 0, -1, 1}; + + static class Point { + //빨간구슬, 파란구슬, 총 이동 횟수 저장 + int rx, ry, bx, by, cnt; + + public Point() { + } + + public Point(int rx, int ry, int bx, int by, int cnt) { + this.rx = rx; + this.ry = ry; + this.bx = bx; + this.by = by; + this.cnt = cnt; + } + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer tokens = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(tokens.nextToken()); + M = Integer.parseInt(tokens.nextToken()); + + pos = new Point(); + map = new char[N][M]; + + for (int i = 0; i < N; i++) { + String temp = br.readLine(); + for (int j = 0; j < M; j++) { + map[i][j] = temp.charAt(j); + if (map[i][j] == 'R') {//빨간 구슬 위치 입력 + pos.rx = i; + pos.ry = j; + } else if (map[i][j] == 'B') {//파란 구슬 위치 입력 + pos.bx = i; + pos.by = j; + } + } + } + + pos.cnt = 0; //초기 이동값 0 + + bfs(); + + }//end main + + private static void bfs() { + + Queue queue = new LinkedList<>(); + queue.offer(pos); + boolean[][][][] v = new boolean[N][M][N][M]; //앞의 [][]는 빨간구슬 확인, 뒤의 [][]는 파란구슬 확인. 이 체크 안하면 계속 실행됨 + + while (!queue.isEmpty()) { + Point cur = queue.poll(); //현재 위치 가져옴 + v[cur.rx][cur.ry][cur.bx][cur.by] = true; //방문했다 표시 + + if (cur.cnt >= 10) {//10회 이상 움직이면 -1 + System.out.println(-1); + return; + } + + for (int d = 0; d < 4; d++) {//4방으로 굴려봄 + + boolean red = false, blue = false; //어느 구슬이 빠졌는지 확인할 flag + + //빨간공 먼저 굴림 + int rx = cur.rx; + int ry = cur.ry; + + while (map[rx + dr[d]][ry + dc[d]] != '#') {//벽 안 만날때까지 + rx += dr[d]; //선택한 방향으로 인덱스 증가 + ry += dc[d]; + if (map[rx][ry] == 'O') {//구멍만나면 탈출 + red = true; //빨간구슬이 빠졌다고 표시 + break; + } + } + + //파란공 굴림 + int bx = cur.bx; + int by = cur.by; + + while (map[bx + dr[d]][by + dc[d]] != '#') {//벽 안 만날때까지 + bx += dr[d]; + by += dc[d]; + if (map[bx][by] == 'O') {//구멍만나면 탈출 + blue = true; //파란구슬 빠졌다고 표시 + break; + } + } + + if (blue) {//파란공이 빠졌는지 먼저 체크. 빠졌으면 아래 진행 안 하고 다음 방향으로 넘어감 + continue; + } + if (red) {//파란공 안 빠지고, 빨간공이 빠졌으면 결과 출력후 종료. bfs이기 때문에 최소 횟수가 됨 + System.out.println(cur.cnt + 1); + return; + } + + if (rx == bx && ry == by) { //빨간구슬과 파란구슬이 같은 위치에 도착했다면, 처음 위치에서 어느쪽이 먼저 있는지 확인 + switch (d) { //움직이는 방향에 따라서 도착위치 파악 가능 + case 0: //위로 움직이는 방향. 열이 같음 + if (cur.rx < cur.bx) //처음에 빨간파란구슬 위치 비교. + bx += 1; //도착지점 비교. 빨간공이 초기에 파란구슬보다 앞에 있다면 빨간공이 먼저 도착하기 때문에 파란공은 한칸 아래로 내려줌 + else + rx += 1; + break; + case 1: //아래로 움직이는 방향. 열이 같음 + if (cur.rx < cur.bx) //처음에 빨간파란구슬 위치 비교 + rx -= 1; //도착지점 비교 + else + bx -= 1; + break; + case 2: //좌로 움직이는 방향. 행이 같음 + if (cur.ry < cur.by) //처음에 빨간파란구슬 위치 비교 + by += 1; //도착지점 비교 + else + ry += 1; + break; + case 3: //우로 움직이는 방향. 행이 같음 + if (cur.ry < cur.by) //처음에 빨간파란구슬 위치 비교 + ry -= 1; //도착지점 비교 + else + by -= 1; + break; + } + } + + if (!v[rx][ry][bx][by]) { //벽을 만났을때 갈 수 있는 새로운 위치 큐에 넣어줌 + queue.offer(new Point(rx, ry, bx, by, cur.cnt + 1)); + } + } + } + System.out.println(-1); //다 돌았는데도 못나오면 -1 + } + + +}