From 47d35f369bf79f523a23a3e81856d3a94d44c9cc Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:12:59 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[20250719]=20BOJ=20/=20G3=20/=20=EB=84=A4?= =?UTF-8?q?=20=EA=B0=9C=EC=9D=98=20=EC=86=8C=EC=88=98=20/=20=EC=9D=B4?= =?UTF-8?q?=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... \353\247\214\353\223\244\352\270\260 .md" | 140 ++++++------------ 1 file changed, 46 insertions(+), 94 deletions(-) diff --git "a/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" "b/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" index d6fdf3d8..46d970f3 100644 --- "a/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" +++ "b/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" @@ -4,127 +4,79 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; +import java.util.List; public class Main { - static int[][] arr; - static boolean[][] visited; - static int[] dy = {-1,0,1,0}; - static int[] dx = {0,1,0,-1}; - static int size; - static final int LAND = 1; - static final int WATER = 0; + static StringBuilder sb = new StringBuilder(); + static int target; + static boolean[] num; + + // 골드바흐의 강한 추측: 2보다 큰 짝수는 항상 두 소수의 합으로 표현할 수 있다. + // 골드바흐의 약한 추측: 5보다 큰 홀수는 항상 세 소수의 합으로 표현할 수 있다. + // 8 이상의 짝수는 항상 네 소수의 합으로 표현 가능하다-> 두 소수 + 2 + 2 + // 9 이상의 홀수는 항상 네 소수의 합으로 표현 가능하다.-> 세 소수 + 2 + // 즉 8이상은 항상 표현이 가능하다. public static void main(String[] args) throws IOException { init(); - int result = process(); - System.out.println(result); + process(); + print(); } private static void init() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - size = Integer.parseInt(br.readLine()); - arr = new int[size][size]; - - for (int i = 0; i < size; i++){ - StringTokenizer st = new StringTokenizer(br.readLine()); - for (int j = 0; j < size; j++){ - arr[i][j] = Integer.parseInt(st.nextToken()); - } - } + target = Integer.parseInt(br.readLine()); + num = new boolean[target + 1]; + Arrays.fill(num, true); + num[0] = false; + num[1] = false; } - private static int process() { - // 모든 섬들을 서로 다른 번호로 표시 - visited = new boolean[size][size]; - int islandNum = 2; - - for (int i = 0; i < size; i++){ - for (int j = 0; j < size; j++){ - if (arr[i][j] == LAND && !visited[i][j]){ - markIsland(i, j, islandNum); - islandNum++; - } - } + private static void process() { + if (target < 8) { + sb.append(-1); + return; } - // 각 섬에서 다른 섬으로 가는 최단 거리 찾기 - int minDistance = Integer.MAX_VALUE; - - for (int currentIsland = 2; currentIsland < islandNum; currentIsland++) { - int distance = bfsFromIsland(currentIsland); - minDistance = Math.min(minDistance, distance); + getPrimes(); + int curNum = target; + if ( target % 2 == 0){ + sb.append("2 2 "); + curNum -= 4; + } else { + sb.append("2 3 "); + curNum -= 5; } - return minDistance; - } - - private static void markIsland(int y, int x, int islandNum) { - Queue q = new LinkedList<>(); - arr[y][x] = islandNum; - q.add(new Point(x, y)); - visited[y][x] = true; - - while (!q.isEmpty()){ - Point p = q.poll(); - for (int i = 0; i < 4; i++) { - int nx = p.x + dx[i]; - int ny = p.y + dy[i]; - if (ny < 0 || ny >= size || nx < 0 || nx >= size) continue; - if (visited[ny][nx] || arr[ny][nx] != LAND) continue; - - visited[ny][nx] = true; - arr[ny][nx] = islandNum; - q.add(new Point(nx, ny)); + for (int i = 2; i <= curNum/2; i++) { + if (num[i] && num[ curNum - i]) { + sb.append(i).append(" ").append(curNum-i); + return; } } } - private static int bfsFromIsland(int startIsland) { - Queue queue = new LinkedList<>(); - boolean[][] bfsVisited = new boolean[size][size]; - - // 시작 섬의 모든 셀을 큐에 추가 - for (int i = 0; i < size; i++){ - for (int j = 0; j < size; j++){ - if (arr[i][j] == startIsland){ - queue.add(new Point(j, i)); - bfsVisited[i][j] = true; + private static void getPrimes() { + for (int i = 2; i * i <= target; i++) { + if (num[i]) { + int temp = i*2; + while ( temp <= target ) { + num[temp] = false; + temp += i; } } - } - - int distance = 0; - while (!queue.isEmpty()) { - int qSize = queue.size(); + } + } - for (int i = 0; i < qSize; i++) { - Point p = queue.poll(); - for (int k = 0; k < 4; k++) { - int nx = p.x + dx[k]; - int ny = p.y + dy[k]; + private static void print() { + System.out.println(sb.toString()); + } - if (nx < 0 || ny < 0 || nx >= size || ny >= size) continue; - if (bfsVisited[ny][nx]) continue; - // 다른 섬을 찾았다면 거리 반환 - if (arr[ny][nx] >= 2 && arr[ny][nx] != startIsland) { - return distance; - } - // 물이면 다음 레벨로 확장 - if (arr[ny][nx] == WATER) { - bfsVisited[ny][nx] = true; - queue.add(new Point(nx, ny)); - } - } - } - distance++; - } - - return Integer.MAX_VALUE; - } } + ``` \ No newline at end of file From 6907444dd39622d22616566a582b1a667d28a868 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:14:55 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Update=2018=20BOJ=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EA=B8=B0=20.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... \353\247\214\353\223\244\352\270\260 .md" | 141 ++++++++++++------ 1 file changed, 95 insertions(+), 46 deletions(-) diff --git "a/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" "b/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" index 46d970f3..591309b1 100644 --- "a/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" +++ "b/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" @@ -4,79 +4,128 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; -import java.util.List; public class Main { + static int[][] arr; + static boolean[][] visited; + static int[] dy = {-1,0,1,0}; + static int[] dx = {0,1,0,-1}; + static int size; + static final int LAND = 1; + static final int WATER = 0; - static StringBuilder sb = new StringBuilder(); - static int target; - static boolean[] num; - - // 골드바흐의 강한 추측: 2보다 큰 짝수는 항상 두 소수의 합으로 표현할 수 있다. - // 골드바흐의 약한 추측: 5보다 큰 홀수는 항상 세 소수의 합으로 표현할 수 있다. - // 8 이상의 짝수는 항상 네 소수의 합으로 표현 가능하다-> 두 소수 + 2 + 2 - // 9 이상의 홀수는 항상 네 소수의 합으로 표현 가능하다.-> 세 소수 + 2 - // 즉 8이상은 항상 표현이 가능하다. public static void main(String[] args) throws IOException { init(); - process(); - print(); + int result = process(); + System.out.println(result); } private static void init() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - target = Integer.parseInt(br.readLine()); - num = new boolean[target + 1]; - Arrays.fill(num, true); - num[0] = false; - num[1] = false; + size = Integer.parseInt(br.readLine()); + arr = new int[size][size]; + + for (int i = 0; i < size; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int j = 0; j < size; j++){ + arr[i][j] = Integer.parseInt(st.nextToken()); + } + } } - private static void process() { - if (target < 8) { - sb.append(-1); - return; + private static int process() { + // 모든 섬들을 서로 다른 번호로 표시 + visited = new boolean[size][size]; + int islandNum = 2; + + for (int i = 0; i < size; i++){ + for (int j = 0; j < size; j++){ + if (arr[i][j] == LAND && !visited[i][j]){ + markIsland(i, j, islandNum); + islandNum++; + } + } } - getPrimes(); - int curNum = target; - if ( target % 2 == 0){ - sb.append("2 2 "); - curNum -= 4; - } else { - sb.append("2 3 "); - curNum -= 5; + // 각 섬에서 다른 섬으로 가는 최단 거리 찾기 + int minDistance = Integer.MAX_VALUE; + + for (int currentIsland = 2; currentIsland < islandNum; currentIsland++) { + int distance = bfsFromIsland(currentIsland); + minDistance = Math.min(minDistance, distance); } - for (int i = 2; i <= curNum/2; i++) { - if (num[i] && num[ curNum - i]) { - sb.append(i).append(" ").append(curNum-i); - return; + return minDistance; + } + + private static void markIsland(int y, int x, int islandNum) { + Queue q = new LinkedList<>(); + arr[y][x] = islandNum; + q.add(new Point(x, y)); + visited[y][x] = true; + + while (!q.isEmpty()){ + Point p = q.poll(); + for (int i = 0; i < 4; i++) { + int nx = p.x + dx[i]; + int ny = p.y + dy[i]; + if (ny < 0 || ny >= size || nx < 0 || nx >= size) continue; + if (visited[ny][nx] || arr[ny][nx] != LAND) continue; + + visited[ny][nx] = true; + arr[ny][nx] = islandNum; + q.add(new Point(nx, ny)); } } } - private static void getPrimes() { - for (int i = 2; i * i <= target; i++) { - if (num[i]) { - int temp = i*2; - while ( temp <= target ) { - num[temp] = false; - temp += i; + private static int bfsFromIsland(int startIsland) { + Queue queue = new LinkedList<>(); + boolean[][] bfsVisited = new boolean[size][size]; + + // 시작 섬의 모든 셀을 큐에 추가 + for (int i = 0; i < size; i++){ + for (int j = 0; j < size; j++){ + if (arr[i][j] == startIsland){ + queue.add(new Point(j, i)); + bfsVisited[i][j] = true; } } - } - } + int distance = 0; - private static void print() { - System.out.println(sb.toString()); - } + while (!queue.isEmpty()) { + int qSize = queue.size(); + + for (int i = 0; i < qSize; i++) { + Point p = queue.poll(); + + for (int k = 0; k < 4; k++) { + int nx = p.x + dx[k]; + int ny = p.y + dy[k]; + if (nx < 0 || ny < 0 || nx >= size || ny >= size) continue; + if (bfsVisited[ny][nx]) continue; + // 다른 섬을 찾았다면 거리 반환 + if (arr[ny][nx] >= 2 && arr[ny][nx] != startIsland) { + return distance; + } + // 물이면 다음 레벨로 확장 + if (arr[ny][nx] == WATER) { + bfsVisited[ny][nx] = true; + queue.add(new Point(nx, ny)); + } + } + } + distance++; + } + + return Integer.MAX_VALUE; + } } -``` \ No newline at end of file +``` From 48e6c5394c79b4c265641b466a27de9e36032231 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:16:09 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[20250718]=20BOJ=20/=20G3=20/=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EB=A7=8C=EB=93=A4=EA=B8=B0=20/=20=EC=9D=B4?= =?UTF-8?q?=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From b08499083e9f02f5a6a7efa5acbb3fc83e992d99 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:16:39 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[20250718]=20BOJ=20/=20G3=20/=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EB=A7=8C=EB=93=A4=EA=B8=B0=20/=20=EC=9D=B4?= =?UTF-8?q?=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" "b/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" index 591309b1..e50370b9 100644 --- "a/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" +++ "b/0224LJH/202507/18 BOJ \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 .md" @@ -5,7 +5,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.*; -public class Main { +public class Main { static int[][] arr; static boolean[][] visited; static int[] dy = {-1,0,1,0}; From 3f189763e1b964ddff5ca8b44b45ff7a6595df34 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:17:53 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[20250719]=20BOJ=20/=20G3=20/=20=EB=84=A4?= =?UTF-8?q?=20=EA=B0=9C=EC=9D=98=20=EC=86=8C=EC=88=98=20/=20=EC=9D=B4?= =?UTF-8?q?=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\354\235\230 \354\206\214\354\210\230 .md" | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 "0224LJH/202507/19 BOJ \353\204\244 \352\260\234\354\235\230 \354\206\214\354\210\230 .md" diff --git "a/0224LJH/202507/19 BOJ \353\204\244 \352\260\234\354\235\230 \354\206\214\354\210\230 .md" "b/0224LJH/202507/19 BOJ \353\204\244 \352\260\234\354\235\230 \354\206\214\354\210\230 .md" new file mode 100644 index 00000000..46d970f3 --- /dev/null +++ "b/0224LJH/202507/19 BOJ \353\204\244 \352\260\234\354\235\230 \354\206\214\354\210\230 .md" @@ -0,0 +1,82 @@ +```java +import java.awt.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; +import java.util.List; + +public class Main { + + static StringBuilder sb = new StringBuilder(); + static int target; + static boolean[] num; + + // 골드바흐의 강한 추측: 2보다 큰 짝수는 항상 두 소수의 합으로 표현할 수 있다. + // 골드바흐의 약한 추측: 5보다 큰 홀수는 항상 세 소수의 합으로 표현할 수 있다. + // 8 이상의 짝수는 항상 네 소수의 합으로 표현 가능하다-> 두 소수 + 2 + 2 + // 9 이상의 홀수는 항상 네 소수의 합으로 표현 가능하다.-> 세 소수 + 2 + // 즉 8이상은 항상 표현이 가능하다. + public static void main(String[] args) throws IOException { + init(); + process(); + print(); + } + + private static void init() throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + target = Integer.parseInt(br.readLine()); + num = new boolean[target + 1]; + Arrays.fill(num, true); + num[0] = false; + num[1] = false; + } + + private static void process() { + if (target < 8) { + sb.append(-1); + return; + } + + getPrimes(); + int curNum = target; + if ( target % 2 == 0){ + sb.append("2 2 "); + curNum -= 4; + } else { + sb.append("2 3 "); + curNum -= 5; + } + + for (int i = 2; i <= curNum/2; i++) { + if (num[i] && num[ curNum - i]) { + sb.append(i).append(" ").append(curNum-i); + return; + } + } + } + + private static void getPrimes() { + for (int i = 2; i * i <= target; i++) { + if (num[i]) { + int temp = i*2; + while ( temp <= target ) { + num[temp] = false; + temp += i; + } + } + + } + } + + + private static void print() { + System.out.println(sb.toString()); + } + + + +} + + +``` \ No newline at end of file