diff --git a/BOJ_RANK.md b/BOJ_RANK.md
index 3b8dfb7..ddd79d0 100644
--- a/BOJ_RANK.md
+++ b/BOJ_RANK.md
@@ -12,12 +12,12 @@
#### ๐ ํ๋ํฐ๋
+[](https://solved.ac/y2kdj9723)
+
queue = new LinkedList<>();
+ queue.add(new int[] {red[0], red[1], blue[0], blue[1], 0}); // ํ์ ์ฝ์
+ visited[red[0]][red[1]][blue[0]][blue[1]] = true; // ๋นจ๊ฐ๊ตฌ์ฌ ํ๋๊ตฌ์ฌ ์์น ๋ฐฉ๋ฌธํ์
+
+ // BFS ์ํ
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll(); // [๋นจ๊ฐ๊ตฌ์ฌํ, ๋นจ๊ฐ๊ตฌ์ฌ์ด, ํ๋๊ตฌ์ฌํ, ํ๋๊ตฌ์ฌ์ด, ์์ง์ธํ์]
+ int count = cur[4]; // ์์ง์ธ ํ์
+
+ // ํ๋๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ก์ผ๋ฉด ํจ์ค
+ if (holeCheck(cur[2], cur[3])) {
+ continue;
+ } else {
+ // ํ๋๊ตฌ์ฌ์ด ๋น ์ง์ง ์์์ผ๋ฉด์ ๋นจ๊ฐ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ก์ผ๋ฉด ์ฑ๊ณต ๋ฐ ์ข
๋ฃ
+ if (holeCheck(cur[0], cur[1])) {
+ result = count;
+ break;
+ }
+ }
+
+ if (count == 11) break; // ์ด๋ํ์๊ฐ 11์ด ๋ ์์ ์์ ๋ชจ๋ ์ข
๋ฃ
+
+ for (int i = 0; i < 4; i++) {
+ int[] next = move(cur, i); // * ์ํ์ข์ฐ๋ก ๊ธฐ์ธ์ด๊ธฐ
+
+ // ๊ธฐ์ธ์ฌ์ ์๊ธด ์์น๊ฐ ํ๋ฒ๋ ๋์จ์ ์ด ์๋ค๋ฉด ๋ฐฉ๋ฌธํ์ ํ ํ์ ์ฝ์
+ if (!visited[next[0]][next[1]][next[2]][next[3]]) {
+ visited[next[0]][next[1]][next[2]][next[3]] = true;
+ queue.add(new int[] {next[0], next[1], next[2], next[3], count+1});
+ }
+ }
+ }
+ }
+
+ // ! ๊ตฌ๋ฉ์ ๋น ์ก๋์ง ์ฒดํฌํ๋ ํจ์
+ public static boolean holeCheck(int x, int y) {
+ if (x == hole[0] && y == hole[1]) {
+ return true;
+ }
+ return false;
+ }
+
+ // ! ๊ธฐ์ธ์ฌ์ ๋นจ๊ฐ๊ตฌ์ฌ๊ณผ ํ๋๊ตฌ์ฌ์ ์์ง์ด๋ ํจ์ - 0(์) 1(ํ) 2(์ข) 3(์ฐ)
+ public static int[] move(int[] cur, int dir) {
+ int[] red = new int[] {cur[0], cur[1]}; // ๋นจ๊ฐ ๊ตฌ์ฌ ์์น
+ int[] blue = new int[] {cur[2], cur[3]}; // ํ๋ ๊ตฌ์ฌ ์์น
+
+ // * dir(0~3)์ ๋ฐ๋ผ ์์ง์ด๋ ๋ค์ ์์น๊ฐ ์๋ ์กฐ๊ฑด์ ๋ง์กฑํ ๋
+ // * (๋ค์์ด .[๊ฐ ์ ์๋ ์์น] ์ด๋ฉด์) && (ํ์ฌ ์์น๊ฐ ๊ตฌ๋ฉ์ด ์๋๋ฉด์) && (๋ค์์ผ๋ก ๊ฐ๋๊ฒ ๊ตฌ๋ฉ์ ๋น ์ง์ง ์์ ์ํ์ ๋ธ๋ฃจ๋ ๊ฒน์น์ง ์๋ ๊ฒฝ์ฐ)
+ // * ๋นจ๊ฐ๊ตฌ์ฌ ์กฐ๊ฑด || ํ๋๊ตฌ์ฌ ์กฐ๊ฑด
+ while ((arr[red[0] + dx[dir]][red[1] + dy[dir]] == '.' && !(red[0] == hole[0] && red[1] == hole[1]) && !(!(blue[0] == hole[0] && blue[1] == hole[1]) && red[0] + dx[dir] == blue[0] && red[1] + dy[dir] == blue[1]))
+ ||
+ (arr[blue[0] + dx[dir]][blue[1] + dy[dir]] == '.' && !(blue[0] == hole[0] && blue[1] == hole[1]) && !(!(red[0] == hole[0] && red[1] == hole[1]) && blue[0] + dx[dir] == red[0] && blue[1] + dy[dir] == red[1]))) {
+
+ // * ์ while๋ฌธ์ ๋นจ๊ฐ๊ตฌ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ๋นจ๊ฐ๊ตฌ์ฌ ์ด๋
+ if (arr[red[0] + dx[dir]][red[1] + dy[dir]] == '.'
+ && !(red[0] == hole[0] && red[1] == hole[1])
+ && !(!(blue[0] == hole[0] && blue[1] == hole[1]) && red[0] + dx[dir] == blue[0] && red[1] + dy[dir] == blue[1])) {
+ red[0] += dx[dir];
+ red[1] += dy[dir];
+ }
+
+ // * ์ while๋ฌธ์ ํ๋๊ตฌ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ํ๋๊ตฌ์ฌ ์ด๋
+ if (arr[blue[0] + dx[dir]][blue[1] + dy[dir]] == '.'
+ && !(blue[0] == hole[0] && blue[1] == hole[1])
+ && !(!(red[0] == hole[0] && red[1] == hole[1]) && blue[0] + dx[dir] == red[0] && blue[1] + dy[dir] == red[1])) {
+ blue[0] += dx[dir];
+ blue[1] += dy[dir];
+ }
+ }
+
+ // * ์ต์ข
์์น ๋ฆฌํด
+ return new int[] {red[0], red[1], blue[0], blue[1]};
+ }
+
+ // ! ๋นจ๊ฐ๊ตฌ์ฌ, ํ๋๊ตฌ์ฌ, ๊ตฌ๋ฉ ์์น ์ฐพ๊ธฐ
+ public static void findBead() {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (arr[i][j] == 'R') {
+ red = new int[] {i, j};
+ arr[i][j] = '.';
+ } else if (arr[i][j] == 'B') {
+ blue = new int[] {i, j};
+ arr[i][j] = '.';
+ } else if (arr[i][j] == 'O') {
+ hole = new int[] {i, j};
+ arr[i][j] = '.';
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ String[] s = br.readLine().split(" ");
+ n = Integer.parseInt(s[0]);
+ m = Integer.parseInt(s[1]);
+
+ arr = new char[n][m];
+ visited = new boolean[n][m][n][m];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/I/G1_1562.java b/java/BOJ/Gold/I/G1_1562.java
new file mode 100644
index 0000000..b58b408
--- /dev/null
+++ b/java/BOJ/Gold/I/G1_1562.java
@@ -0,0 +1,72 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1562
+ *
+ * ? ์ ๋ชฉ: ๊ณ๋จ ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * 45656์ด๋ ์๋ฅผ ๋ณด์.
+ * ์ด ์๋ ์ธ์ ํ ๋ชจ๋ ์๋ฆฌ์ ์ฐจ์ด๊ฐ 1์ด๋ค. ์ด๋ฐ ์๋ฅผ ๊ณ๋จ ์๋ผ๊ณ ํ๋ค.
+ * N์ด ์ฃผ์ด์ง ๋, ๊ธธ์ด๊ฐ N์ด๋ฉด์ 0๋ถํฐ 9๊น์ง ์ซ์๊ฐ ๋ชจ๋ ๋ฑ์ฅํ๋ ๊ณ๋จ ์๊ฐ ์ด ๋ช ๊ฐ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. 0์ผ๋ก ์์ํ๋ ์๋ ๊ณ๋จ์๊ฐ ์๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. N์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 10 -> n
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ ๋ต์ 1,000,000,000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.124์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 16MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class G1_1562 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ int n = Integer.parseInt(br.readLine());
+ int div = 1_000_000_000;
+
+ int[][][] dp = new int[n + 1][10][1 << 10];
+
+ for (int i = 1; i <= 9; i++) {
+ dp[1][i][1 << i] = 1;
+ }
+
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j <= 9; j++) {
+ for (int k = 0; k < (1 << 10); k++) {
+ if (j > 0) {
+ int bit = k | (1 << (j - 1));
+ dp[i + 1][j - 1][bit] = (dp[i + 1][j - 1][bit] + dp[i][j][k]) % div;
+ }
+
+ if (j < 9) {
+ int bit = k | (1 << (j + 1));
+ dp[i + 1][j + 1][bit] = (dp[i + 1][j + 1][bit] + dp[i][j][k]) % div;
+ }
+ }
+ }
+ }
+
+ int answer = 0;
+ for (int i = 0; i <= 9; i++) {
+ answer = (answer + dp[n][i][(1 << 10) - 1]) % div;
+ }
+
+ System.out.println(answer);
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/I/G1_16933.java b/java/BOJ/Gold/I/G1_16933.java
new file mode 100644
index 0000000..95bf8a6
--- /dev/null
+++ b/java/BOJ/Gold/I/G1_16933.java
@@ -0,0 +1,121 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16933
+ *
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * NรM์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค. ์ด๋ํ์ง ์๊ณ ๊ฐ์ ์นธ์ ๋จธ๋ฌผ๋ฌ์๋ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ๋ค. ์ด ๊ฒฝ์ฐ๋ ๋ฐฉ๋ฌธํ ์นธ์ ๊ฐ์๊ฐ ํ๋ ๋์ด๋๋ ๊ฒ์ผ๋ก ์๊ฐํด์ผ ํ๋ค.
+ * ์ด๋ฒ ๋ฌธ์ ์์๋ ๋ฎ๊ณผ ๋ฐค์ด ๋ฒ๊ฐ์๊ฐ๋ฉด์ ๋ฑ์ฅํ๋ค. ๊ฐ์ฅ ์ฒ์์ ์ด๋ํ ๋๋ ๋ฎ์ด๊ณ , ํ ๋ฒ ์ด๋ํ ๋๋ง๋ค ๋ฎ๊ณผ ๋ฐค์ด ๋ฐ๋๊ฒ ๋๋ค. ์ด๋ํ์ง ์๊ณ ๊ฐ์ ์นธ์ ๋จธ๋ฌด๋ฅด๋ ๊ฒฝ์ฐ์๋ ๋ฎ๊ณผ ๋ฐค์ด ๋ฐ๋๊ฒ ๋๋ค.
+ * ๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ K๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค. ๋จ, ๋ฒฝ์ ๋ฎ์๋ง ๋ถ์ ์ ์๋ค.
+ * ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค.
+ * ๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N(1 โค N โค 1,000), M(1 โค M โค 1,000), K(1 โค K โค 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
+ *
+ * 1 4 1 -> n m k
+ * 0010 -> arr[0][0] ~ arr[0][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 4708ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 700MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.I;
+
+import java.io.*;
+import java.util.ArrayDeque;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G1_16933 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m, k;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int answer = -1;
+ static int[][][][] visited;
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0 ,0, 1, -1};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bfs(); // * 2. BFS
+
+ System.out.println(answer); // * 3. ์ ๋ต ์ถ๋ ฅ
+
+ br.close();
+ }
+
+ // ! BFS
+ public static void bfs() {
+ // ๋ฎ : 0 , ๋ฐค : 1
+ Queue queue = new ArrayDeque<>(); // ! LinkedList -> ์๊ฐ์ด๊ณผ
+ queue.add(new int[] {0, 0, 0, 0}); // [X, Y, K, D]
+ visited[0][0][0][0] = 1;
+
+ // ! 4์ฐจ์ BFS ํ์ด visited[ํ][์ด][๋ฒฝ์๋ถ์ํ์][๋ฎor๋ฐค]
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == n-1 && cur[1] == m-1) {
+ answer = visited[cur[0]][cur[1]][cur[2]][cur[3]];
+ break;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ continue;
+ }
+
+ if (arr[nx][ny] == '1' && cur[2] < k && cur[3] == 0 && visited[nx][ny][cur[2]+1][cur[3]^1] == 0) {
+ visited[nx][ny][cur[2]+1][cur[3]^1] = visited[cur[0]][cur[1]][cur[2]][cur[3]] + 1;
+ queue.add(new int[] {nx, ny, cur[2]+1, cur[3]^1});
+ } else if (arr[nx][ny] == '0') {
+ if (visited[nx][ny][cur[2]][cur[3]^1] == 0) {
+ visited[nx][ny][cur[2]][cur[3]^1] = visited[cur[0]][cur[1]][cur[2]][cur[3]] + 1;
+ queue.add(new int[] {nx, ny, cur[2], cur[3]^1});
+ }
+ }
+
+ if (visited[cur[0]][cur[1]][cur[2]][cur[3]^1] == 0) {
+ visited[cur[0]][cur[1]][cur[2]][cur[3]^1] = visited[cur[0]][cur[1]][cur[2]][cur[3]] + 1;
+ queue.add(new int[] {cur[0], cur[1], cur[2], cur[3]^1});
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ visited = new int[n][m][k+1][2];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/I/G1_16933_2.java b/java/BOJ/Gold/I/G1_16933_2.java
new file mode 100644
index 0000000..f146a29
--- /dev/null
+++ b/java/BOJ/Gold/I/G1_16933_2.java
@@ -0,0 +1,130 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16933
+ *
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * NรM์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค. ์ด๋ํ์ง ์๊ณ ๊ฐ์ ์นธ์ ๋จธ๋ฌผ๋ฌ์๋ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ๋ค. ์ด ๊ฒฝ์ฐ๋ ๋ฐฉ๋ฌธํ ์นธ์ ๊ฐ์๊ฐ ํ๋ ๋์ด๋๋ ๊ฒ์ผ๋ก ์๊ฐํด์ผ ํ๋ค.
+ * ์ด๋ฒ ๋ฌธ์ ์์๋ ๋ฎ๊ณผ ๋ฐค์ด ๋ฒ๊ฐ์๊ฐ๋ฉด์ ๋ฑ์ฅํ๋ค. ๊ฐ์ฅ ์ฒ์์ ์ด๋ํ ๋๋ ๋ฎ์ด๊ณ , ํ ๋ฒ ์ด๋ํ ๋๋ง๋ค ๋ฎ๊ณผ ๋ฐค์ด ๋ฐ๋๊ฒ ๋๋ค. ์ด๋ํ์ง ์๊ณ ๊ฐ์ ์นธ์ ๋จธ๋ฌด๋ฅด๋ ๊ฒฝ์ฐ์๋ ๋ฎ๊ณผ ๋ฐค์ด ๋ฐ๋๊ฒ ๋๋ค.
+ * ๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ K๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค. ๋จ, ๋ฒฝ์ ๋ฎ์๋ง ๋ถ์ ์ ์๋ค.
+ * ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค.
+ * ๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N(1 โค N โค 1,000), M(1 โค M โค 1,000), K(1 โค K โค 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
+ *
+ * 1 4 1 -> n m k
+ * 0010 -> arr[0][0] ~ arr[0][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 916ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 302MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.I;
+
+import java.io.*;
+import java.util.ArrayDeque;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G1_16933_2 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m, k;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int answer = -1;
+ static int[][] visited;
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0 ,0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bfs(); // * 2. BFS
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(answer);
+ }
+
+ // ! BFS
+ public static void bfs() {
+ // ๋ฎ : ํ , ๋ฐค : ์ง
+ Queue queue = new ArrayDeque<>();
+ queue.add(new int[] {0, 0, 0, 1}); // [X, Y, K, D]
+ visited[0][0] = 0;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == n-1 && cur[1] == m-1) {
+ answer = cur[3];
+ break;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ continue;
+ }
+
+ if (visited[nx][ny] <= cur[2]) {
+ continue;
+ }
+
+ if (arr[nx][ny] == '1') {
+ if (cur[2] >= k || visited[nx][ny] <= cur[2] + 1) {
+ continue;
+ }
+
+ if (cur[3] % 2 == 0) {
+ queue.add(new int[] {cur[0], cur[1], cur[2], cur[3]+1});
+ } else {
+ visited[nx][ny] = cur[2] + 1;
+ queue.add(new int[] {nx, ny, cur[2] + 1, cur[3] + 1});
+ }
+ } else {
+ visited[nx][ny] = cur[2];
+ queue.add(new int[] {nx, ny, cur[2], cur[3]+1});
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ visited = new int[n][m];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ visited[i][j] = 2000000;
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/I/G1_1981.java b/java/BOJ/Gold/I/G1_1981.java
new file mode 100644
index 0000000..f09dc87
--- /dev/null
+++ b/java/BOJ/Gold/I/G1_1981.java
@@ -0,0 +1,128 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1981
+ *
+ * ? ์ ๋ชฉ: ๋ฐฐ์ด์์ ์ด๋
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * nรn์ง๋ฆฌ์ ๋ฐฐ์ด์ด ํ๋ ์๋ค. ์ด ๋ฐฐ์ด์ (1, 1)์์ (n, n)๊น์ง ์ด๋ํ๋ ค๊ณ ํ๋ค. ์ด๋ํ ๋๋ ์, ํ, ์ข, ์ฐ์ ๋ค ์ธ์ ํ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค.
+ * ์ด์ ๊ฐ์ด ์ด๋ํ๋ค ๋ณด๋ฉด, ๋ฐฐ์ด์์ ๋ช ๊ฐ์ ์๋ฅผ ๊ฑฐ์ณ์ ์ด๋ํ๊ฒ ๋๋ค. ์ด๋ํ๊ธฐ ์ํด ๊ฑฐ์ณ ๊ฐ ์๋ค ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐจ์ด๊ฐ ๊ฐ์ฅ ์์์ง๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ n(2 โค n โค 100)์ด ์ฃผ์ด์ง๋ค. ๋ค์ n๊ฐ์ ์ค์๋ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ๊ฐ ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 200๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
+ *
+ * 5 -> n
+ * 1 1 3 6 8 -> arr[0][0] ~ arr[0][n-1]
+ * 1 2 2 5 5
+ * 4 4 0 3 3
+ * 8 0 2 3 4
+ * 4 3 0 2 1 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ (์ต๋ - ์ต์)๊ฐ ๊ฐ์ฅ ์์์ง ๋์ ๊ทธ ๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.508์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 293MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 8
+ */
+package Gold.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.*;
+
+public class G1_1981 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n;
+ static int[][] arr;
+
+ static int MIN = 200;
+ static int MAX = 0;
+ static boolean[][] visit;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ int left = 0;
+ int right = MAX - MIN;
+ while (left <= right) {
+ int gap = (left + right) / 2;
+ boolean canGo = bfs(gap);
+
+ if (canGo) {
+ right = gap-1;
+ } else {
+ left = gap+1;
+ }
+ }
+
+ System.out.println(left);
+ }
+
+ public static boolean bfs(int gap) {
+ Queue queue;
+ for (int m = MIN; m + gap <= MAX; m++) {
+ if (arr[0][0] < m || m + gap < arr[0][0]) {
+ continue;
+ }
+
+ queue = new LinkedList<>();
+ visit = new boolean[n][n];
+ visit[0][0] = true;
+ queue.add(new int[] {0, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == n-1 && cur[1] == n-1) {
+ return true;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= n || visit[nx][ny]) {
+ continue;
+ }
+
+ if (m <= arr[nx][ny] && arr[nx][ny] <= m + gap) {
+ visit[nx][ny] = true;
+ queue.add(new int[] {nx, ny});
+ }
+
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n][n];
+ visit = new boolean[n][n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ MAX = Math.max(MAX, arr[i][j]);
+ MIN = Math.min(MIN, arr[i][j]);
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/I/G1_2098.java b/java/BOJ/Gold/I/G1_2098.java
new file mode 100644
index 0000000..9be4db1
--- /dev/null
+++ b/java/BOJ/Gold/I/G1_2098.java
@@ -0,0 +1,104 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2098
+ *
+ * ? ์ ๋ชฉ: ์ธํ์ ์ํ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ธํ์ ์ํ ๋ฌธ์ ๋ ์์ด๋ก Traveling Salesman problem (TSP) ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฌธ์ ๋ก computer science ๋ถ์ผ์์ ๊ฐ์ฅ ์ค์ํ๊ฒ ์ทจ๊ธ๋๋ ๋ฌธ์ ์ค ํ๋์ด๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ณ์ข
๋ฌธ์ ๊ฐ ์์ผ๋, ์ฌ๊ธฐ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ์ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์.
+ * 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ ๋์๋ค์ด ์๊ณ , ๋์๋ค ์ฌ์ด์๋ ๊ธธ์ด ์๋ค. (๊ธธ์ด ์์ ์๋ ์๋ค) ์ด์ ํ ์ธํ์์ด ์ด๋ ํ ๋์์์ ์ถ๋ฐํด N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๊ฑฐ์ณ ๋ค์ ์๋์ ๋์๋ก ๋์์ค๋ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ณํํ๋ ค๊ณ ํ๋ค. ๋จ, ํ ๋ฒ ๊ฐ๋ ๋์๋ก๋ ๋ค์ ๊ฐ ์ ์๋ค. (๋งจ ๋ง์ง๋ง์ ์ฌํ์ ์ถ๋ฐํ๋ ๋์๋ก ๋์์ค๋ ๊ฒ์ ์์ธ) ์ด๋ฐ ์ฌํ ๊ฒฝ๋ก๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์๋๋ฐ, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ์ฌํ ๊ณํ์ ์ธ์ฐ๊ณ ์ ํ๋ค.
+ * ๊ฐ ๋์๊ฐ์ ์ด๋ํ๋๋ฐ ๋๋ ๋น์ฉ์ ํ๋ ฌ W[i][j]ํํ๋ก ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ ๋์ j๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค. ๋น์ฉ์ ๋์นญ์ ์ด์ง ์๋ค. ์ฆ, W[i][j] ๋ W[j][i]์ ๋ค๋ฅผ ์ ์๋ค. ๋ชจ๋ ๋์๊ฐ์ ๋น์ฉ์ ์์ ์ ์์ด๋ค. W[i][i]๋ ํญ์ 0์ด๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋์ i์์ ๋์ j๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฉฐ ์ด๋ด ๊ฒฝ์ฐ W[i][j]=0์ด๋ผ๊ณ ํ์.
+ * N๊ณผ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ์ธํ์์ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋์์ ์ N์ด ์ฃผ์ด์ง๋ค. (2 โค N โค 16) ๋ค์ N๊ฐ์ ์ค์๋ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ๋ ฌ์ ์ฑ๋ถ์ 1,000,000 ์ดํ์ ์์ ์ ์์ด๋ฉฐ, ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ 0์ด ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ j๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค.
+ * ํญ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 4 -> n
+ * 0 10 15 20 -> arr[0][0] ~ arr[0][n-1]
+ * 5 0 9 10
+ * 6 13 0 12
+ * 8 8 9 0 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ธํ์์ ์ํ์ ํ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 35
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.152์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 17MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 10+
+ */
+package Gold.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G1_2098 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int MAX = 987654321;
+ static int[][] dist;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ.
+ System.out.println(dfs(0, 1)); // * 2. TSP ์๊ณ ๋ฆฌ์ฆ + ์ ๋ต ์ถ๋ ฅ
+ }
+
+ // * TSP(์ธํ์ ์ํ ์๊ณ ๋ฆฌ์ฆ) : Travelling Salesman Problem
+ public static int dfs(int cur, int visit) {
+ if (visit == (1 << n) - 1) {
+ if (arr[cur][0] == 0) {
+ return MAX;
+ }
+ return arr[cur][0];
+ }
+
+ if (dist[cur][visit] != -1) {
+ return dist[cur][visit];
+ }
+
+ dist[cur][visit] = MAX;
+
+ for (int i = 0; i < n; i++) {
+ if ((visit & (1 << i)) != 0 || arr[cur][i] == 0) {
+ continue;
+ }
+ dist[cur][visit] = Math.min(dist[cur][visit],
+ dfs(i, visit | (1 << i)) + arr[cur][i]);
+ }
+
+ return dist[cur][visit];
+ }
+
+ // * ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n][n];
+ dist = new int[n][(1 << n) - 1];
+ for (int[] d : dist) {
+ Arrays.fill(d, -1);
+ }
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/I/G1_9328.java b/java/BOJ/Gold/I/G1_9328.java
new file mode 100644
index 0000000..fb59ca2
--- /dev/null
+++ b/java/BOJ/Gold/I/G1_9328.java
@@ -0,0 +1,222 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9328
+ *
+ * ? ์ ๋ชฉ: ์ด์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์๊ทผ์ด๋ 1์ธต ๋น๋ฉ์ ์นจ์
ํด ๋งค์ฐ ์ค์ํ ๋ฌธ์๋ฅผ ํ์ณ์ค๋ ค๊ณ ํ๋ค. ์๊ทผ์ด๊ฐ ๊ฐ์ง๊ณ ์๋ ํ๋ฉด๋์๋ ๋ฌธ์์ ์์น๊ฐ ๋ชจ๋ ๋ํ๋ ์๋ค. ๋น๋ฉ์ ๋ฌธ์ ๋ชจ๋ ์ ๊ฒจ์๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ์ด๋ ค๋ฉด ์ด์ ๊ฐ ํ์ํ๋ค. ์๊ทผ์ด๋ ์ผ๋ถ ์ด์ ๋ฅผ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๊ณ , ์ผ๋ถ ์ด์ ๋ ๋น๋ฉ์ ๋ฐ๋ฅ์ ๋์ฌ์ ธ ์๋ค. ์๊ทผ์ด๋ ์ํ์ข์ฐ๋ก๋ง ์ด๋ํ ์ ์๋ค.
+ * ์๊ทผ์ด๊ฐ ํ์น ์ ์๋ ๋ฌธ์์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ํ
์คํธ ์ผ์ด์ค์ ์๋ 100๊ฐ๋ฅผ ๋์ง ์๋๋ค.
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์ง๋์ ๋์ด์ ๋๋น h์ w (2 โค h, w โค 100)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ h๊ฐ ์ค์๋ ๋น๋ฉ์ ๋ํ๋ด๋ w๊ฐ์ ๋ฌธ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ๋ฌธ์๋ ๋ค์ ์ค ํ๋์ด๋ค.
+ *
+ * '.'๋ ๋น ๊ณต๊ฐ์ ๋ํ๋ธ๋ค.
+ * '*'๋ ๋ฒฝ์ ๋ํ๋ด๋ฉฐ, ์๊ทผ์ด๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค.
+ * '$'๋ ์๊ทผ์ด๊ฐ ํ์ณ์ผํ๋ ๋ฌธ์์ด๋ค.
+ * ์ํ๋ฒณ ๋๋ฌธ์๋ ๋ฌธ์ ๋ํ๋ธ๋ค.
+ * ์ํ๋ฒณ ์๋ฌธ์๋ ์ด์ ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ทธ ๋ฌธ์์ ๋๋ฌธ์์ธ ๋ชจ๋ ๋ฌธ์ ์ด ์ ์๋ค.
+ * ๋ง์ง๋ง ์ค์๋ ์๊ทผ์ด๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์ด์ ๊ฐ ๊ณต๋ฐฑ์์ด ์ฃผ์ด์ง๋ค. ๋ง์ฝ, ์ด์ ๋ฅผ ํ๋๋ ๊ฐ์ง๊ณ ์์ง ์๋ ๊ฒฝ์ฐ์๋ "0"์ด ์ฃผ์ด์ง๋ค.
+ * ์๊ทผ์ด๋ ์ฒ์์๋ ๋น๋ฉ์ ๋ฐ์ ์์ผ๋ฉฐ, ๋น๋ฉ ๊ฐ์ฅ์๋ฆฌ์ ๋ฒฝ์ด ์๋ ๊ณณ์ ํตํด ๋น๋ฉ ์ํ์ ๋๋๋ค ์ ์๋ค. ๊ฐ๊ฐ์ ๋ฌธ์ ๋ํด์, ๊ทธ ๋ฌธ์ ์ด ์ ์๋ ์ด์ ์ ๊ฐ์๋ 0๊ฐ, 1๊ฐ, ๋๋ ๊ทธ ์ด์์ด๊ณ , ๊ฐ๊ฐ์ ์ด์ ์ ๋ํด์, ๊ทธ ์ด์ ๋ก ์ด ์ ์๋ ๋ฌธ์ ๊ฐ์๋ 0๊ฐ, 1๊ฐ, ๋๋ ๊ทธ ์ด์์ด๋ค. ์ด์ ๋ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ค.
+ *
+ * 3 -> t
+ * 5 17 -> h w
+ * ***************** -> arr
+ * .............**$*
+ * *B*A*P*C**X*Y*.X.
+ * *y*x*a*p**$*$**$*
+ * *****************
+ * cz -> keys
+ * 5 11 -> ๋ฐ๋ณต
+ * *.*********
+ * *...*...*x*
+ * *X*.*.*.*.*
+ * *$*...*...*
+ * ***********
+ * 0
+ * 7 7
+ * *ABCDE*
+ * X.....F
+ * W.$$$.G
+ * V.$$$.H
+ * U.$$$.J
+ * T.....K
+ * *SQPML*
+ * irony
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค ๋ง๋ค, ์๊ทผ์ด๊ฐ ํ์น ์ ์๋ ๋ฌธ์์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ * 1
+ * 0
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.188์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 20MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.I;
+
+import java.io.*;
+import java.util.*;
+
+public class G1_9328 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int h, w;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int keys; // ํ์ฌ ๊ฐ๊ณ ์๋ ํค ์ ๋ณด(๋นํธ๋ง์คํฌ)
+ static int count; // ํ์ฌ ํ๋ํ ๋ฌธ์์ ๊ฐ์
+ static boolean[][] visited; // ๋ฐฉ๋ฌธ ํ์ ๋ฐฐ์ด
+
+ // * ์ถ๊ฐ ์ ๋ณด
+ // ! ํค๊ฐ ์์ด์ ํต๊ณผํ์ง ๋ชปํ ๋ฌธ์ ์์น
+ // ex) 0 : [[1, 2], [2,3], ...] -> ํ์ฌ๊น์ง ํค๊ฐ ์์ด์ ํต๊ณผํ์ง ๋ชปํ A(=0)๋ฌธ์ ์์น๋ค
+ static HashMap> map;
+ static Queue queue;
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine()); // ํ
์คํธ์ผ์ด์ค ๊ฐ์
+ for (int i = 0; i < t; i++) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ for (int a = 0; a < h; a++) {
+ for (int b = 0; b < w; b++) {
+ // * 2. ํ
๋๋ฆฌ๊ฐ ๋ฒฝ์ด ์๋ ๊ณณ๋ค์ ํ์ ์ฝ์
(+๋ฐฉ๋ฌธํ์)
+ if (a == 0 || b == 0 || a == h-1 || b == w-1) {
+ if (arr[a][b] != '*') {
+ visited[a][b] = true;
+ queue.add(new int[] {a, b});
+ }
+ }
+ }
+ }
+
+ bfs(); // * 3. BFS
+
+ bw.write(String.valueOf(count + "\n")); // * 4. ์ถ๋ ฅ
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void bfs() {
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+ int x = cur[0];
+ int y = cur[1];
+
+ // ํ์ฌ ์์น๊ฐ ํค์ธ ๊ฒฝ์ฐ
+ if (isKey(arr[x][y])) {
+ // ์๋กญ๊ฒ ํค๋ฅผ ์ต๋ํ ๊ฒฝ์ฐ
+ if ((keys & (1 << (arr[x][y] - 'a'))) == 0) {
+ keys |= (1 << (arr[x][y] - 'a')); // ํค ์ถ๊ฐ
+
+ // ํ์ฌ๊น์ง ํด๋น ํค๊ฐ ์์ด์ ํต๊ณผํ์ง ๋ชปํ ์์น๋ค ์ค
+ // ๋ฌธ์ด ์์ด๋ ค์๋ ๊ณณ("."์ด ์๋ ๊ณณ)์ ํ์ ๋ฃ์ด์ฃผ๊ณ ๋ฐฉ๋ฌธ ํ์
+ // ๋ฌธ์ด ์ด๋ ธ์ผ๋ฏ๋ก ๋น๊ณต๊ฐ์ผ๋ก ํ์
+ for (int[] next : map.get(arr[x][y] - 'a')) {
+ if (arr[next[0]][next[1]] != '.') {
+ visited[next[0]][next[1]] = true;
+ queue.add(next);
+ arr[next[0]][next[1]] = '.';
+ }
+ }
+ }
+ // ํค๋ฅผ ํ๋ํ์ผ๋ฏ๋ก ๋น๊ณต๊ฐ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ
+ arr[x][y] = '.';
+ }
+
+ // ํ์ฌ ์์น๊ฐ ๋ฐฉ๋ฌธ์ธ ๊ฒฝ์ฐ
+ else if (isDoor(arr[x][y])) {
+ // ํด๋น ๋ฌธ์ ๋ํ ํค๊ฐ ์์ ๊ฒฝ์ฐ
+ if (!hasKey(arr[x][y])) {
+ // map์ ํด๋น ์์น ์ถ๊ฐ
+ map.get(arr[x][y] - 'A').add(new int[] {x, y});
+ continue;
+ }
+ }
+
+ // ํ์ฌ ์์น๊ฐ ๋ฌธ์์ธ ๊ฒฝ์ฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐํ๊ณ ๋น๊ณต๊ฐ์ผ๋ก ํ์
+ else if (arr[x][y] == '$') {
+ arr[x][y] = '.';
+ count++;
+ }
+
+ // ์ํ์ข์ฐ ์ค ๋ฒฝ์ด ์๋ ๊ณณ๋ง ํ์ ์ฝ์
(+๋ฐฉ๋ฌธํ์)
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= h || ny >= w || visited[nx][ny] || arr[nx][ny] == '*') {
+ continue;
+ }
+
+ visited[nx][ny] = true;
+ queue.add(new int[] {nx, ny});
+ }
+
+ }
+ }
+
+ // ํด๋น ๋ฌธ์ ๋ง๋ ํค๋ฅผ ํ์ฌ ๊ฐ์ง๊ณ ์๋์ง
+ public static boolean hasKey(char door) {
+ return (keys & (1 << (door - 'A'))) != 0;
+ }
+
+ // ํ์ฌ ์์น์ ๊ฐ์ด ๋ฌธ์ธ์ง
+ public static boolean isDoor(char c) {
+ return 0 <= c - 'A' && c - 'A' < 26;
+ }
+
+ // ํ์ฌ ์์น์ ๊ฐ์ด ํค์ธ์ง
+ public static boolean isKey(char c) {
+ return 0 <= c - 'a' && c - 'a' < 26;
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ h = Integer.parseInt(st.nextToken());
+ w = Integer.parseInt(st.nextToken());
+
+ count = 0;
+ arr = new char[h][w];
+ visited = new boolean[h][w];
+ queue = new LinkedList<>();
+
+ map = new HashMap<>();
+ for (int i = 0; i < 26; i++) {
+ map.put(i, new ArrayList<>());
+ }
+
+ for (int i = 0; i < h; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ keys = 0;
+ char[] k = br.readLine().toCharArray();
+
+ if (k[0] != '0') {
+ for (char c: k) {
+ keys |= (1 << (c - 'a'));
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_10423.java b/java/BOJ/Gold/II/G2_10423.java
new file mode 100644
index 0000000..a89e1e5
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_10423.java
@@ -0,0 +1,124 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/10423
+ *
+ * ? ์ ๋ชฉ: ์ ๊ธฐ๊ฐ ๋ถ์กฑํด
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ธ๊ณ์์ GDP๊ฐ ๊ฐ์ฅ ๋์ ์๊ฐ ๋๋ผ๋ ์ํํธ์จ์ด์ ํ๋์จ์ด ๊ธฐ์ ์ด ๋ชจ๋ ์ต๊ณ ๋ผ์ IT๊ฐ๊ตญ์ด๋ผ ๋ถ๋ฆฌ๊ณ , 2015๋
๋ถํฐ ์ธ์์์ ๊ฐ์ฅ ์ด๊ธฐ ์ข์ ๋๋ผ 1๋ฑ์ผ๋ก ๊ผฝํ๊ณ ์๋ค.
+ * ์ด๊ธฐ ์ข์ ๋๋ผ 1๋ฑ์ผ๋ก ๊ผฝํ ์ดํ ์ธ๊ตญ์ธ ๋ฐฉ๋ฌธ๊ฐ๋ค์ด ๋ง์์ก๊ณ , ๊ทธ์ ๋ฐ๋ผ ์ ๊ธฐ ์๋น์จ์ด ์ฆ๊ฐํ์ฌ ์ ๊ธฐ๊ฐ ๋ง์ด ๋ถ์กฑํ ์ํฉ์ด ๋์๋ค. ๋ฐ๋ผ์ ์๊ฐ ๋๋ผ์ ๋ํต๋ น์ ์ต๊ทผ ๊ฐ๋ฐ์ด ์๋ฃ๋ YNY๋ฐ์ ์ ํ๋ก์ ํธ๋ฅผ ์งํ ํ๊ธฐ๋ก ํ์๋ค. ๋ฐ์ ์๋ฅผ ๋ง๋ค ๋ ์ค์ํ ๊ฒ์ ๋ฐ์ ์ ๊ฑด๋ฌผ๊ณผ ๋์๋ก ์ ๊ธฐ๋ฅผ ๊ณต๊ธํด ์ค ์ผ์ด๋ธ์ด๋ค. ๋ฐ์ ์๋ ์ด๋ฏธ ํน์ ๋์์ ๊ฑด์ค๋์ด ์๊ณ , ๋ฐ๋ผ์ ์ถ๊ฐ์ ์ผ๋ก ๋๋ ๋น์ฉ์ ์ผ์ด๋ธ์ ์ค์นํ ๋ ๋๋ ๋น์ฉ์ด ์ ๋ถ์ด๋ค. ์ด ํ๋ก์ ํธ์ ๋ฌธ์ ๋ ์ผ์ด๋ธ์ ์ค์นํ ๋ ๋๋ ๋น์ฉ์ด ๊ต์ฅํ ํฌ๋ฏ๋ก ์ด๋ฅผ ์ต์ํํด์ ์ค์นํ์ฌ ๋ชจ๋ ๋์์ ์ ๊ธฐ๋ฅผ ๊ณต๊ธํ๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ๋ถ์ N๊ฐ์ ๋์๊ฐ ์๊ณ M๊ฐ์ ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ์ผ์ด๋ธ์ ์ ๋ณด์ K๊ฐ์ YNY๋ฐ์ ์๊ฐ ์ค์น๋ ๋์๊ฐ ์ฃผ์ด์ง๋ฉด ์ผ์ด๋ธ ์ค์น ๋น์ฉ์ ์ต์๋ก ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋์์ ์ ๊ธฐ๊ฐ ๊ณต๊ธํ ์ ์๋๋ก ํด๊ฒฐํด์ผ ํ๋ค. ์ค์ํ ์ ์ ์ด๋ ํ ๋์๊ฐ ๋ ๊ฐ์ ๋ฐ์ ์์์ ์ ๊ธฐ๋ฅผ ๊ณต๊ธ๋ฐ์ผ๋ฉด ๋ญ๋น๊ฐ ๋๋ฏ๋ก ์ผ์ด๋ธ์ด ์ฐ๊ฒฐ๋์ด์๋ ๋์์๋ ๋ฐ์ ์๊ฐ ๋ฐ๋์ ํ๋๋ง ์กด์ฌํด์ผ ํ๋ค. ์๋ Figure 1๋ฅผ ๋ณด์. 9๊ฐ์ ๋์์ 3 ๊ฐ์ YNY๋ฐ์ ์(A,B,I)๊ฐ ์๊ณ , ๊ฐ๊ฐ์ ๋์๋ค์ ์ฐ๊ฒฐํ ๋ ๋๋ ๋น์ฉ์ด ์ฃผ์ด์ง๋ค.
+ * ์ด ์์ ์์ ๋ชจ๋ ๋์์ ์ ๊ธฐ๋ฅผ ๊ณต๊ธํ๊ธฐ ์ํ์ฌ ์ค์นํ ์ผ์ด๋ธ์ ์ต์ ๋น์ฉ์ 22์ด๊ณ , Figure 2์ ๊ตต์ ๊ฐ์ ์ด ์ฐ๊ฒฐํ ์ผ์ด๋ธ์ด๋ค. B ๋์๋ ์ฐ๊ฒฐ๋ ๋์๊ฐ ํ๋๋ ์์ง๋ง, ๋ฐ์ ์๊ฐ ์ค์น๋ ๋์๋ ์ ๊ธฐ๊ฐ ๊ณต๊ธ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ด์๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ๋์์ ๊ฐ์ N(1 โค N โค 1,000)๊ณผ ์ค์น ๊ฐ๋ฅํ ์ผ์ด๋ธ์ ์ M(1 โค M โค 100,000)๊ฐ, ๋ฐ์ ์์ ๊ฐ์ K(1 โค K โค N)๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ๋ฐ์ ์๊ฐ ์ค์น๋ ๋์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์
์งธ ์ค๋ถํฐ M๊ฐ์ ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ์ผ์ด๋ธ์ ์ ๋ณด๊ฐ u, v, w๋ก ์ฃผ์ด์ง๋ค. ์ด๋ u๋์์ v๋์๋ฅผ ์ฐ๊ฒฐํ๋ ์ผ์ด๋ธ์ ์ค์นํ ๋ w์ ๋น์ฉ์ด ๋๋ ๊ฒ์ ์๋ฏธํ๋ค. w๋ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์์ด๋ค.
+ *
+ * 4 5 1 -> n m k
+ * 1 -> gen[0] ~ gen[k-1]
+ * 1 2 5 -> a b c
+ * 1 3 5 -> a b c
+ * 1 4 5 -> a b c
+ * 2 3 10 -> a b c
+ * 3 4 10 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ชจ๋ ๋์์ ์ ๊ธฐ๋ฅผ ๊ณต๊ธํ ์ ์๋๋ก ์ผ์ด๋ธ์ ์ค์นํ๋ ๋ฐ ๋๋ ์ต์๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 15
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.568
+ * * ๋ฉ๋ชจ๋ฆฌ: 53MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+
+public class G2_10423 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m, k;
+ static int[] gen;
+ static boolean[] visit;
+ static ArrayList[] cable;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ prim();
+ }
+
+ public static void prim() {
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
+ for (int g : gen) {
+ visit[g] = true;
+ for (int[] c : cable[g]) {
+ if (!visit[c[0]]) {
+ pq.add(c);
+ }
+ }
+ }
+
+ int cost = 0;
+ int count = k;
+ while (!pq.isEmpty()) {
+ if (count >= n) {
+ break;
+ }
+
+ int[] cur = pq.poll();
+ if (visit[cur[0]]) {
+ continue;
+ }
+
+ cost += cur[1];
+ count++;
+ visit[cur[0]] = true;
+
+ for (int[] next : cable[cur[0]]) {
+ if (!visit[next[0]]) {
+ pq.add(next);
+ }
+ }
+ }
+
+ System.out.println(cost);
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ st = new StringTokenizer(br.readLine());
+ gen = new int[k];
+ for (int i = 0; i < k; i++) {
+ gen[i] = Integer.parseInt(st.nextToken());
+ }
+
+ visit = new boolean[n + 1];
+ cable = new ArrayList[n + 1];
+ for (int i = 1; i <= n; i++) {
+ cable[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ cable[a].add(new int[]{b, c});
+ cable[b].add(new int[]{a, c});
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_10711.java b/java/BOJ/Gold/II/G2_10711.java
new file mode 100644
index 0000000..b663d48
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_10711.java
@@ -0,0 +1,121 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/10711
+ *
+ * ? ์ ๋ชฉ: ๋ชจ๋์ฑ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๋ช
์ฐ์ ์น๊ตฌ๋ค์ ์ฌ๋ฆ๋ฐฉํ์ ๋ง์ดํ์ฌ ํด๋ณ๊ฐ์ ๋๋ฌ๊ฐ๊ธฐ๋ก ํ๋ค. ์ด๋ฒ์ ์ฌํ์ ๋ ๋ ํด์์์ฅ์ ์ด๋ฆ์ ALPS(Awsome Land & Poor Sea)์ด๋ค.
+ * ํด๋ณ๊ฐ์์ ์์๋ณต์ ์
์ ๋ฏธ๋
๋ค์๊ฒ ๊ด์ฌ์ด ๋ง์ ์์ฒ ์ด์๋ ๋ฌ๋ฆฌ ๋ช
์ฐ๋ ํด๋ณ๊ฐ์ ๋ชจ๋์ ๋ ๊ด์ฌ์ด ๋ง๋ค. ํด๋ณ๊ฐ์ ๋ชจ๋๋ ๋ฌดํํ ๊ฒ๋ค์ ๋ง๋ค ์ ์๋ ๊ฐ๋ฅ์ฑ์ ๋ดํฌํ๊ณ ์๋ค. ๋ํ ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์ํ์ด ํ๋์ ์ํด ์ฌ๋ผ์ง๋ ๋ชจ์ต์, ๋ง์น ์์ ์ด ๊ฐ์ฅ ๋น๋ ์ ์๋ ์๊ฐ์ ์๊ณ ์ค์ค๋ก ์๋ฆ๋ต๊ฒ ์ฐํํ๋ ค๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์ด๋ฐ ์๋ฒฝ์ ๊ฐ๊น์ด ๋ฌผํ์ธ ๋ชจ๋๋ฅผ ๋๊ณ ์ ํด์์์ด๋ ํค์์ ์น๋ ๊ฒ์ ์ธ์์ ๋ญ๋นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ์๋ฌด๋ ๋ช
์ฐ์ ๋ง์ ๊ณต๊ฐํด์ฃผ์ง ๋ชปํ๊ณ , ๊ฒฐ๊ตญ ๋ช
์ฐ๋ ํผ์์ ๋ชจ๋์ฑ์ ๋ง๋ค์๋ค.
+ *
+ * ๋ค๋ฅธ ์น๊ตฌ๋ค์ด ํผ์ ์ ํ์ ๋คํด ๋๊ณ ์์ ๋ ๋ช
์ฐ๋ ํผ์ ์ ํ์ ๋คํด ๋ชจ๋์ฑ์ ์์๋ค. ์ด ๋ชจ๋์ฑ์ ์ธ์ ๊ฐ ํ๋์ ์ํด์ ๋ฌด๋์ง ํฐ... ๋ช
์ฐ๋ ์ด๋ฐ ๋ฌด๋์ง๋ ์์ ์ ์ผํ์ผ๋ก ์ดํดํ ์ฌ๋์ด๋ฏ๋ก ๋ฌด๋์ง๋ ๊ฒ๋ ๊ณ ๋ คํด์ ๋ชจ๋์ฑ์ ๋ง๋ค์๋ค.
+ *
+ * ๊ทธ๊ฐ ๋ง๋ ๋ชจ๋์ฑ์ 2์ฐจ์ ๊ฒฉ์๋จ์๋ก ๋ง๋ค์์ผ๋ฉฐ, ๊ฐ ๊ฒฉ์๋ง๋ค ํผํผํจ์ ์ ๋๋ฅผ ๋ค๋ฅด๊ฒ ํด์ ์ฑ์ ๋ง๋ค์๋ค. ์ด ํผํผํจ์ 1๋ถํฐ 9 ์ฌ์ด์ ์ซ์๋ก ํํ๋ ์ ์๋ค. ์ด ํผํผํจ์, ์๊ธฐ ๊ฒฉ์ ์ฃผ๋ณ์ 8๋ฐฉํฅ (์ ์๋ ์ผ์ชฝ ์ค๋ฅธ์ชฝ, ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ ) ์ ๋ด์ ๋ชจ๋์ฑ์ด ์์ฌ์์ง ์์ ๋ถ๋ถ์ ๊ฐ์๊ฐ ์๊ธฐ ๋ชจ๋์ฑ์ ํผํผํจ๋ณด๋ค ๋ง๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ ํ๋์ ์ํด์ ๋ฌด๋์ง ์ ์์์ ์๋ฏธํ๋ค. ๊ทธ ์ด์ธ์ ๊ฒฝ์ฐ๋ ํ๋๊ฐ ์ณ๋ ๋ฌด๋์ง์ง ์๋๋ค. ๋ชจ๋์ฑ์ด ๋ฌด๋์ง ๊ฒฝ์ฐ, ๊ทธ ๊ฒฉ์๋ ๋ชจ๋์ฑ์ด ์์ฌ์์ง ์์ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ค.
+ *
+ * ์ด ๋ชจ๋์ฑ์ ์ธ์ ๊ฐ๋ ํ๋์ ์ํด์ ๊น์ด๊ณ ๊น์ฌ์, ๊ฒฐ๊ตญ ํ๊ฐ์ง ํํ๋ก ์๋ ดํ ๊ฒ์ด๋ค. ๋ชจ๋์ฑ์ ์์ฑํ ๋ช
์ฐ๋ ๋ฌธ๋ ์์ ์ด ๋ง๋ ์์ ํ์ ์๋ช
์ด ๊ถ๊ธํด์ก๋ค. ๋ชจ๋์ฑ์ ์์ ์์ ํ ๋ฐ์ ๊ฐ์ด ํ๋๊ฐ ํ๋ฒ ์น ๋๋ง๋ค ํน์ ๋ถ๋ถ์ด ๋ฌด๋์ ๋ด๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๋ชจ์์ด ๋ณํ๋๋ค. ๋ชจ๋์ฑ์ด ๋์ด์ ๋ชจ์์ด ๋ณํ์ง ์๊ฒ ๋๋ ค๋ฉด (๋ชจ์์ด ์๋ ด๋๋ ค๋ฉด) ํ๋๊ฐ ๋ช๋ฒ ์ณ์ผํ๋์ง ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ๋ชจ๋์ฑ์ ๊ฐ๋ก์ธ๋ก ๊ฒฉ์ ํฌ๊ธฐ H, W๊ฐ ์ฃผ์ด์ง๋ค. (1 โค H, W โค 1,000)
+ * ๊ทธ ๋ค์ H์ค์ ๊ฑธ์ณ W๊ฐ์ ๋ฌธ์๋ก ๋ชจ๋์ฑ์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์๊ฐ ๋ค์ด์จ๋ค.
+ * ๊ฐ ๋ฌธ์๋ 1~9 ์ฌ์ด์ ์ซ์, ๋๋ '.' ์ด๋ค. 1~9๋ ๊ทธ ๊ฒฉ์์ ๋ชจ๋์ ๊ฐ๋๋ฅผ ๋ํ๋ด๋ฉฐ, '.'๋ ๋ชจ๋๊ฐ ์๋ค๋ ๋ป์ด๋ค.
+ * ๋ชจ๋์ฑ์ ๊ฒฉ์์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํด ์์ง ์๋ค.
+ *
+ * 5 6 -> h w
+ * ...... -> arr[0][0] ~ arr[0][w-1]
+ * .939..
+ * .3428.
+ * .9393.
+ * ...... -> arr[h-1][0] ~ arr[h-1][w-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ช๋ฒ์ ํ๋๊ฐ ๋ชฐ๋ ค์ค๊ณ ๋์์ผ ๋ชจ๋์ฑ์ ์ํ๊ฐ ์๋ ดํ๋์ง๋ฅผ ๊ตฌํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.388์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 70MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G2_10711 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int h, w;
+ static char[][] arr;
+ static Queue queue;
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ int time = 0;
+ while (!queue.isEmpty()) {
+ int size = queue.size();
+
+ for (int i = 0; i < size; i++) {
+ int[] cur = queue.poll();
+
+ for (int dx = -1; dx <= 1; dx++) {
+ for (int dy = -1; dy <= 1; dy++) {
+ if (dx == 0 && dy == 0) {
+ continue;
+ }
+
+ int nx = cur[0] + dx;
+ int ny = cur[1] +dy;
+
+ if (nx < 0 || ny < 0 || nx >= h || ny >= w) {
+ continue;
+ }
+
+ if (arr[nx][ny] == '.') {
+ continue;
+ }
+
+ if (--arr[nx][ny] == '0') {
+ arr[nx][ny] = '.';
+ queue.add(new int[] {nx, ny});
+ }
+ }
+ }
+ }
+
+ if (!queue.isEmpty()) {
+ time++;
+ }
+ }
+
+ System.out.println(time);
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ h = Integer.parseInt(st.nextToken());
+ w = Integer.parseInt(st.nextToken());
+
+ queue = new LinkedList<>();
+ arr = new char[h][w];
+
+ for (int i = 0; i < h; i++) {
+ char[] sands = br.readLine().toCharArray();
+ for (int j = 0; j < w; j++) {
+ arr[i][j] = sands[j];
+ if (arr[i][j] == '.') {
+ queue.add(new int[] {i, j});
+ }
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_10775.java b/java/BOJ/Gold/II/G2_10775.java
new file mode 100644
index 0000000..3ea4388
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_10775.java
@@ -0,0 +1,95 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/10775
+ *
+ * ! ์ ๋ชฉ: ๊ณตํญ
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ! ๋ฌธ์
+ * ์ค๋์ ์ ์น์์ ์์ผ์ด๋ค.
+ * ๋ฐ์น์์ ์์ผ์ ๋ง์ ์ ์น์์๊ฒ ์ธ์ฒ๊ตญ์ ๊ณตํญ์ ์ ๋ฌผ๋ก ์คฌ๋ค.
+ * ๊ณตํญ์๋ G๊ฐ์ ๊ฒ์ดํธ๊ฐ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ 1์์ G๊น์ง์ ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
+ * ๊ณตํญ์๋ P๊ฐ์ ๋นํ๊ธฐ๊ฐ ์์๋๋ก ๋์ฐฉํ ์์ ์ด๋ฉฐ, ๋น์ ์ i๋ฒ์งธ ๋นํ๊ธฐ๋ฅผ 1๋ฒ๋ถํฐ gi (1 โค gi โค G) ๋ฒ์งธ ๊ฒ์ดํธ์ค ํ๋์ ์๊ตฌ์ ์ผ๋ก ๋ํนํ๋ ค ํ๋ค. ๋นํ๊ธฐ๊ฐ ์ด๋ ๊ฒ์ดํธ์๋ ๋ํนํ ์ ์๋ค๋ฉด ๊ณตํญ์ด ํ์๋๊ณ , ์ดํ ์ด๋ค ๋นํ๊ธฐ๋ ๋์ฐฉํ ์ ์๋ค.
+ * ์ ์น์์ ๊ฐ์ฅ ๋ง์ ๋นํ๊ธฐ๋ฅผ ๊ณตํญ์ ๋ํน์์ผ์ ๋ฐ์น์์ ํ๋ณตํ๊ฒ ํ๊ณ ์ถ์ดํ๋ค. ์น์์ด๋ ๋นํ๊ธฐ๋ฅผ ์ต๋ ๋ช ๋ ๋ํน์ํฌ ์ ์๋๊ฐ?
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์๋ ๊ฒ์ดํธ์ ์ G (1 โค G โค 105)๊ฐ ์ฃผ์ด์ง๋ค.
+ * ๋ ๋ฒ์งธ ์ค์๋ ๋นํ๊ธฐ์ ์ P (1 โค P โค 105)๊ฐ ์ฃผ์ด์ง๋ค.
+ * ์ดํ P๊ฐ์ ์ค์ gi (1 โค gi โค G) ๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 4 -> g
+ * 3 -> p
+ * 4 -> dock
+ * 1 -> dock
+ * 1 -> dock
+ *
+ * ! ์ถ๋ ฅ
+ * ์น์์ด๊ฐ ๋ํน์ํฌ ์ ์๋ ์ต๋์ ๋นํ๊ธฐ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 364ms
+ * ๋ฉ๋ชจ๋ฆฌ: 29036KB
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.stream.IntStream;
+
+public class G2_10775 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ public static void main(String[] args) throws IOException {
+ // * ํ์ฑ
+ int g = Integer.parseInt(br.readLine());
+ int p = Integer.parseInt(br.readLine());
+
+ // * ๋ถ๋ฆฌ ์งํฉ(UNION_FIND)
+ int[] parent = IntStream.range(0, g+1).toArray();
+
+ // * ๋ํน ์๋ฃ๋ ๋นํ๊ธฐ์ ์
+ int count = 0;
+
+ // * ์์๋๋ก ๋ค์ด์ค๋ ๋ชจ๋ ๋นํ๊ธฐ์ ๋ํด์
+ for (int i = 0; i < p; i++) {
+ int dock = Integer.parseInt(br.readLine()); // * ํ์ฌ ๋นํ๊ธฐ์ ๋ฒํธ
+ union(parent, dock, parent[dock]); // * UNION_FIND => ๋ํน ๊ฐ๋ฅํ ๊ฒ์ดํธ ๋ฒํธ๋ฅผ ์ฐพ์.
+
+ dock = parent[dock]; // * ๋ํน ๊ฐ๋ฅํ ๊ณณ์ dock์ ์ ์ฅ
+ if (dock == 0) break; // * ๋ํนํ ๊ณณ์ด ๋์ด์ ์์ผ๋ฉด ํ์ ํ๊ณ ์ข
๋ฃ
+
+ parent[dock] -= 1; // * ๋ํน ์๋ฃ์ ํด๋น ๊ฒ์ดํธ์ ๋ถ๋ฆฌ์งํฉ ๊ฐ์ -1 (Greedy)
+ count++;
+ }
+
+ bw.write(String.valueOf(count));
+
+ bw.flush();
+ br.close();
+ bw.close();
+ }
+
+ // * UNION_FIND ํจ์
+ public static boolean union(int[] parent, int a, int b) {
+ a = findParent(parent, a);
+ b = findParent(parent, b);
+
+ if (a == b) return false;
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ return true;
+ }
+
+ public static int findParent(int[] parent, int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent, parent[node]);
+ }
+ return parent[node];
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_1103.java b/java/BOJ/Gold/II/G2_1103.java
new file mode 100644
index 0000000..606d4f1
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_1103.java
@@ -0,0 +1,116 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/1103
+ *
+ * ! ์ ๋ชฉ: ๊ฒ์
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ํํ์ด๋ 1๋ถํฐ 9๊น์ง์ ์ซ์์, ๊ตฌ๋ฉ์ด ์๋ ์ง์ฌ๊ฐํ ๋ณด๋์์ ์ฌ๋ฐ๋ ๊ฒ์์ ํ๋ค.
+ * ์ผ๋จ ๋ณด๋์ ๊ฐ์ฅ ์ผ์ชฝ ์์ ๋์ ์ ํ๋ ์ฌ๋ ค๋๋๋ค. ๊ทธ๋ค์์ ๋ค์๊ณผ ๊ฐ์ด ๋์ ์ ์์ง์ธ๋ค.
+ * ๋์ ์ด ์๋ ๊ณณ์ ์ฐ์ฌ ์๋ ์ซ์ X๋ฅผ ๋ณธ๋ค.
+ * ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ ์ค์ ํ๊ฐ์ง๋ฅผ ๊ณ ๋ฅธ๋ค.
+ * ๋์ ์ ์์์ ๊ณ ๋ฅธ ๋ฐฉํฅ์ผ๋ก X๋งํผ ์์ง์ธ๋ค. ์ด๋, ์ค๊ฐ์ ์๋ ๊ตฌ๋ฉ์ ๋ฌด์ํ๋ค.
+ * ๋ง์ฝ ๋์ ์ด ๊ตฌ๋ฉ์ ๋น ์ง๊ฑฐ๋, ๋ณด๋์ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ๋ค๋ฉด ๊ฒ์์ ์ข
๋ฃ๋๋ค. ํํ์ด๋ ์ด ์ฌ๋ฐ๋ ๊ฒ์์ ๋๋๋ก์ด๋ฉด ์ค๋ ํ๊ณ ์ถ๋ค.
+ * ๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ํํ์ด๊ฐ ์ต๋ ๋ช ๋ฒ ๋์ ์ ์์ง์ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ค์ ๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. ์ด ๊ฐ์ ๋ชจ๋ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. ์ฐ์ฌ ์๋ ์ซ์๋ 1๋ถํฐ 9๊น์ง์ ์์ฐ์ ๋๋ H์ด๋ค. ๊ฐ์ฅ ์ผ์ชฝ ์์นธ์ H๊ฐ ์๋๋ค. H๋ ๊ตฌ๋ฉ์ด๋ค.
+ *
+ * 3 7 -> n m
+ * 3942178 -> board[0][0] ~ board[0][m-1]
+ * 1234567
+ * 9123532 -> board[n-1][0] ~ board[n-1][m-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฌธ์ ์ ์ ๋ต์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ํํ์ด๊ฐ ๋์ ์ ๋ฌดํ๋ฒ ์์ง์ผ ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 88ms
+ * ๋ฉ๋ชจ๋ฆฌ: 12492KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G2_1103 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, m;
+ static char[][] board;
+
+ // ์ด๊ธฐ ์ค์
+ static int[] dx = {1, -1, 0, 0}; // ์ํ
+ static int[] dy = {0, 0, 1, -1}; // ์ข์ฐ
+
+ static boolean[][] visited; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ
+ static int[][] dp; // DP๋ฅผ ์ด์ฉํ ๊ฒ์๊ฐ๋ฅํ์ ์ ์ฅ ๋ฐฐ์ด
+
+ // * ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * ๋งจ ์ผ์ชฝ ์์์๋ถํฐ ์์
+ visited[0][0] = true;
+ dfs(0, 0);
+
+ // * (0, 0) ์์์ ๊ฒ์ ๊ฐ๋ฅ ํ์๊ฐ 10000๋ณด๋ค ํฌ๋ฉด ์ธ์ดํด์ด ๋ฐ์ํ๋ฏ๋ก -1์ ์ถ๋ ฅ, ๊ทธ ์ธ์๋ dp[0][0]์ถ๋ ฅ
+ bw.write(String.valueOf(dp[0][0] >= 10000 ? -1 : dp[0][0]));
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static int dfs(int x, int y) {
+ // * ์ด๋ฏธ ๊ฒ์ ํ์๊ฐ ์ ํด์ง ๊ณณ์ ๋ฐฉ๋ฌธํ์ ๋
+ if (dp[x][y] > 0) return dp[x][y];
+
+ for (int i = 0; i < 4; i++) {
+ // * ํด๋น ์์น์ ์ซ์๋งํผ ์ํ์ข์ฐ๋ก ์ด๋ํ ๋์ nx, ny
+ int num = Integer.parseInt(String.valueOf(board[x][y]));
+ int nx = x + num * dx[i];
+ int ny = y + num * dy[i];
+
+ // * ๋ฐค์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ H(๊ตฌ๋ฉ)์ ๋น ์ง๊ฒ ๋ ๊ฒฝ์ฐ dp[x][y]์ ๊ฐ์ 1๊ณผ ๋น๊ตํด์ ํฐ ๊ฐ์ผ๋ก ์ค์
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m || board[nx][ny] == 'H') {
+ dp[x][y] = Math.max(dp[x][y], 1);
+ } else {
+ // * ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ฐฉ๋ฌธํ์ฌ ๋ฌดํ๋ฒ ๊ฒ์ ์คํ์ด ๊ฐ๋ฅํด์ง ๋
+ if (visited[nx][ny]) {
+ dp[x][y] = 10000; // * dp[x][y]๋ฅผ 10000์ผ๋ก ์ค์ ํ๊ณ ์ข
๋ฃ
+ break;
+ } else {
+ visited[nx][ny] = true; // * ๋ฐฉ๋ฌธํ์
+ dp[x][y] = Math.max(dp[x][y], dfs(nx, ny) + 1); // * ์ํ์ข์ฐ๋ก ์ด๋ํ ๊ณณ์ ๊ฒ์ ํ์+1 ์ค ํฐ ๊ฐ์ ์ ์ฅ
+ visited[nx][ny] = false; // * ๋ฐฉ๋ฌธ ํด์
+ }
+ }
+ }
+ return dp[x][y]; // * ํ์ฌ ์์ ์์น์ ๊ฒ์ ๊ฐ๋ฅ ํ์๋ฅผ ๋ฆฌํด
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ visited = new boolean[n][m];
+ board = new char[n][m];
+ dp = new int[n][m];
+
+ for (int i = 0; i < n; i++) {
+ board[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_11780.java b/java/BOJ/Gold/II/G2_11780.java
new file mode 100644
index 0000000..79ef1a7
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_11780.java
@@ -0,0 +1,200 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11780
+ *
+ * ? ์ ๋ชฉ: ํ๋ก์ด๋ 2
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * n(1 โค n โค 100)๊ฐ์ ๋์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋์์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋์์ ๋์ฐฉํ๋ m(1 โค m โค 100,000)๊ฐ์ ๋ฒ์ค๊ฐ ์๋ค. ๊ฐ ๋ฒ์ค๋ ํ ๋ฒ ์ฌ์ฉํ ๋ ํ์ํ ๋น์ฉ์ด ์๋ค.
+ * ๋ชจ๋ ๋์์ ์ (A, B)์ ๋ํด์ ๋์ A์์ B๋ก ๊ฐ๋๋ฐ ํ์ํ ๋น์ฉ์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ n์ด ์ฃผ์ด์ง๊ณ ๋์งธ ์ค์๋ ๋ฒ์ค์ ๊ฐ์ m์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์
์งธ ์ค๋ถํฐ m+2์ค๊น์ง ๋ค์๊ณผ ๊ฐ์ ๋ฒ์ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋จผ์ ์ฒ์์๋ ๊ทธ ๋ฒ์ค์ ์ถ๋ฐ ๋์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๋ฒ์ค์ ์ ๋ณด๋ ๋ฒ์ค์ ์์ ๋์ a, ๋์ฐฉ ๋์ b, ํ ๋ฒ ํ๋๋ฐ ํ์ํ ๋น์ฉ c๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์์ ๋์์ ๋์ฐฉ ๋์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค. ๋น์ฉ์ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 5 -> n
+ * 14 -> m
+ * 1 2 2 -> a b c
+ * 1 3 3 -> a b c
+ * 1 4 1 -> a b c
+ * 1 5 10 -> a b c
+ * 2 4 2 -> a b c
+ * 3 4 1 -> a b c
+ * 3 5 1 -> a b c
+ * 4 5 3 -> a b c
+ * 3 5 10 -> a b c
+ * 3 1 8 -> a b c
+ * 1 4 2 -> a b c
+ * 5 1 7 -> a b c
+ * 3 4 2 -> a b c
+ * 5 2 4 -> a b c
+ *
+ * ?์ถ๋ ฅ
+ * ๋จผ์ , n๊ฐ์ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ค. i๋ฒ์งธ ์ค์ ์ถ๋ ฅํ๋ j๋ฒ์งธ ์ซ์๋ ๋์ i์์ j๋ก ๊ฐ๋๋ฐ ํ์ํ ์ต์ ๋น์ฉ์ด๋ค. ๋ง์ฝ, i์์ j๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ ์๋ฆฌ์ 0์ ์ถ๋ ฅํ๋ค.
+ * ๊ทธ ๋ค์์๋ nรn๊ฐ์ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ค. iรn+j๋ฒ์งธ ์ค์๋ ๋์ i์์ ๋์ j๋ก ๊ฐ๋ ์ต์ ๋น์ฉ์ ํฌํจ๋์ด ์๋ ๋์์ ๊ฐ์ k๋ฅผ ์ถ๋ ฅํ๋ค. ๊ทธ ๋ค์, ๋์ i์์ ๋์ j๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ถ๋ ฅํ๋ค. ์ด๋, ๋์ i์ ๋์ j๋ ์ถ๋ ฅํด์ผ ํ๋ค. ๋ง์ฝ, i์์ j๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 0 2 3 1 4
+ * 12 0 15 2 5
+ * 8 5 0 1 1
+ * 10 7 13 0 3
+ * 7 4 10 6 0
+ * 0
+ * 2 1 2
+ * 2 1 3
+ * 2 1 4
+ * 3 1 3 5
+ * 4 2 4 5 1
+ * 0
+ * 5 2 4 5 1 3
+ * 2 2 4
+ * 3 2 4 5
+ * 2 3 1
+ * 3 3 5 2
+ * 0
+ * 2 3 4
+ * 2 3 5
+ * 3 4 5 1
+ * 3 4 5 2
+ * 4 4 5 1 3
+ * 0
+ * 2 4 5
+ * 2 5 1
+ * 2 5 2
+ * 3 5 1 3
+ * 3 5 2 4
+ * 0
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 552ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 63MB
+ * * ์ธ์ด: JAVA8
+*/
+package Gold.II;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G2_11780 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ์ด๋ ๋น์ฉ์ด ๋์ฌ ์ ์๋ ์ต๋๊ฐ + 1 => MAX๊ฐ์ด๋ฉด ์ด๋ํ ์ ์์์ ๋ปํจ
+ static final int MAX = 10000001;
+
+ // * ํ์ฑ
+ static int n, m; // ๋์ ๊ฐ์ | ๋ฒ์ค ๊ฐ์
+ static int[][] arr; // i -> j ๋ก ๊ฐ๋ ์ต์ ๋น์ฉ ๋ฐฐ์ด(ํ๋ก์ด๋ ์์ฌ)
+
+ // * ์ด๊ธฐ ์ค์
+ static ArrayList[][] dist; // ์ต์ ๋น์ฉ์ผ๋ก ์ด๋ ํ ๋ ์ง๋๋ ๋์ ๋ฐฐ์ด
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ floyd(); // * 2. ํ๋ก์ด๋-์์ฌ
+
+ // * 3. ์ถ๋ ฅ ( ์ต์๋น์ฉ ๋ฐฐ์ด ์ถ๋ ฅ )
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (arr[i][j] == MAX) { // * ๋์ฐฉํ ์ ์์ ๋๋ 0์ ์ถ๋ ฅ
+ sb.append(0 + " ");
+ } else {
+ sb.append(arr[i][j] + " ");
+ }
+ }
+ sb.append("\n");
+ }
+
+ // * 4. ์ถ๋ ฅ ( ์ต์๋น์ฉ์ผ๋ก ์ด๋ํ ๋์ ๋์ ๊ฐ์์ ๊ฒฝ๋ก ์ถ๋ ฅ )
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (arr[i][j] == 0 || arr[i][j] == MAX) { // * ์๊ธฐ์์ ์์ ์๊ธฐ์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก ํน์ ๋์ฐฉํ ์ ์๋ ๊ฒฝ๋ก์ผ ๋ 0 ์ถ๋ ฅ
+ sb.append(0);
+ } else {
+ sb.append((dist[i][j].size() + 2) + " "); // * i -> j๋ก ์ต์๋น์ฉ์ผ๋ก ์ด๋ํ์ ๋ ์ง๋๊ฐ ๋์์ ๊ฐฏ์(dist[i][j].size()) + ์์์ ,์ข
๋ฃ์ (2)
+ sb.append(i + " "); // * ์์์
+
+ // * i -> j ๋ก ์ต์๋น์ฉ์ผ๋ก ์ด๋ํ์ ๋ ์ง๋๋ ๋์๊ฐ 1๊ฐ๋ผ๋ ์์ ๋ ํด๋น ๋์๋ค์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด์ ์ถ๋ ฅ
+ if (dist[i][j].size() > 0) {
+ for (int k : dist[i][j]) {
+ sb.append(k + " ");
+ }
+ }
+ sb.append(j + " "); // * ์ข
๋ฃ์
+ }
+ sb.append("\n");
+ }
+ }
+
+ bw.write(sb.toString());
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ํ๋ก์ด๋-์์ฌ
+ public static void floyd() {
+ for (int k = 1; k <= n; k++) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ // * ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๋์ฐฉํ๋ ๊ฒฝ๋ก๋ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฒฝ์ฐ ํจ์ค
+ if (i == k || k == j) continue;
+
+ // * ์ต์๋น์ฉ์ด ๊ฐฑ์ ๋๋ ์์ ์์
+ if (arr[i][j] > arr[i][k] + arr[k][j]) {
+ arr[i][j] = arr[i][k] + arr[k][j]; // * ์ต์๋น์ฉ ๊ฐฑ์
+
+ dist[i][j] = new ArrayList<>(); // * i -> j๋ฅผ ์ต์๋น์ฉ์ผ๋ก ๊ฐ ๋ ์ง๋๋ ๋์ ์ด๊ธฐํ
+ dist[i][j].addAll(dist[i][k]); // * i -> k๋ฅผ ์ต์๋น์ฉ์ผ๋ก ๊ฐ ๋ ์ง๋๋ ๋์ ์ฝ์
+ dist[i][j].add(k); // * k๋์ ์ฝ์
+ dist[i][j].addAll(dist[k][j]); // * k -> j๋ฅผ ์ต์๋น์ฉ์ผ๋ก ๊ฐ ๋ ์ง๋๋ ๋์ ์ฝ์
+ }
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ m = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1][n+1];
+ for (int[] a : arr) {
+ Arrays.fill(a, MAX);
+ }
+
+ for (int i = 1; i <= n; i++) {
+ arr[i][i] = 0;
+ }
+
+ dist = new ArrayList[n+1][n+1];
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ dist[i][j] = new ArrayList<>();
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ if (arr[a][b] == MAX) {
+ arr[a][b] = c;
+ } else {
+ arr[a][b] = Math.min(arr[a][b], c);
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_11967.java b/java/BOJ/Gold/II/G2_11967.java
new file mode 100644
index 0000000..40e8eac
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_11967.java
@@ -0,0 +1,165 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11967
+ *
+ * ? ์ ๋ชฉ: ๋ถ์ผ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ๋๋ถ ์กด์ ์ต๊ทผ์ N ร N๊ฐ์ ๋ฐฉ์ด ์๋ ๊ฑฐ๋ํ ํ๊ฐ์ ์๋ก ์ง์๋ค. ๊ฐ ๋ฐฉ์ (1, 1)๋ถํฐ (N,N)๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ์๋ค(2 โค N โค 100). ์ด๋ ์ ๋ฌด์์ํ๋ ์์ ๋ฒ ์๋ ์ต๋ํ ๋ง์ ๋ฐฉ์ ๋ถ์ ๋ฐํ๊ณ ์ถ์ดํ๋ค.
+ * ๋ฒ ์๋ ์ ์ผํ๊ฒ ๋ถ์ด ์ผ์ ธ์๋ ๋ฐฉ์ธ (1, 1)๋ฐฉ์์ ์ถ๋ฐํ๋ค. ์ด๋ค ๋ฐฉ์๋ ๋ค๋ฅธ ๋ฐฉ์ ๋ถ์ ๋๊ณ ์ผค ์ ์๋ ์ค์์น๊ฐ ๋ฌ๋ ค์๋ค. ์๋ฅผ ๋ค์ด, (1, 1)๋ฐฉ์ ์๋ ์ค์์น๋ก (1, 2)๋ฐฉ์ ๋ถ์ ๋๊ณ ์ผค ์ ์๋ค. ๋ฒ ์๋ ๋ถ์ด ์ผ์ ธ์๋ ๋ฐฉ์ผ๋ก๋ง ๋ค์ด๊ฐ ์ ์๊ณ , ๊ฐ ๋ฐฉ์์๋ ์ํ์ข์ฐ์ ์ธ์ ํ ๋ฐฉ์ผ๋ก ์์ง์ผ ์ ์๋ค.
+ * ๋ฒ ์๊ฐ ๋ถ์ ์ผค ์ ์๋ ๋ฐฉ์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์๋ N(2 โค N โค 100)๊ณผ, M(1 โค M โค 20,000)์ด ์ ์๋ก ์ฃผ์ด์ง๋ค.
+ * ๋ค์ M์ค์๋ ๋ค ๊ฐ์ ์ ์ x, y, a, b๊ฐ ์ฃผ์ด์ง๋ค. (x, y)๋ฐฉ์์ (a, b)๋ฐฉ์ ๋ถ์ ์ผ๊ณ ๋ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ํ ๋ฐฉ์ ์ฌ๋ฌ๊ฐ์ ์ค์์น๊ฐ ์์ ์ ์๊ณ , ํ๋์ ๋ถ์ ์กฐ์ ํ๋ ์ค์์น ์ญ์ ์ฌ๋ฌ๊ฐ ์์ ์ ์๋ค.
+ *
+ * 3 6 -> n m
+ * 1 1 1 2 -> x y a b
+ * 2 1 2 2 -> x y a b
+ * 1 1 1 3 -> x y a b
+ * 2 3 3 1 -> x y a b
+ * 1 3 1 2 -> x y a b
+ * 1 3 2 1 -> x y a b
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ฒ ์๊ฐ ๋ถ์ ์ผค ์ ์๋ ๋ฐฉ์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ์์ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 240ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 23MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 5
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G2_11967 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static ArrayList[][] light;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[][] visited;
+ static boolean[][] lightOn;
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bfs(); // * 2. BFS
+
+ System.out.println(count()); // * 3. ๋ถ์ผ์ง ๊ฐ์
+ }
+
+ // ! BFS
+ public static void bfs() {
+ visited[1][1] = true; // ์ด๊ธฐ์์น ๋ฐฉ๋ฌธํ์
+ lightOn[1][1] = true; // ์ด๊ธฐ์์น ๋ถ์ผ์ง ํ์
+
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {1, 1});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ // * ํ์ฌ ์์น์์ ๋ถ์ ์ผค ์ ์๋ ๊ณณ์ด ๋ถ์ด ๊บผ์ ธ์๋ค๋ฉด ์ผ์ฃผ๊ธฐ
+ for (int[] l : light[cur[0]][cur[1]]) {
+ if (!lightOn[l[0]][l[1]]) {
+ lightOn[l[0]][l[1]] = true;
+ }
+ }
+
+ // * ๋ถ์ ์๋ก ํจ ๊ณณ ์ค์์(visited[l[0]][l[1]] = false) ๋ฐ๋ก ์ธ์ ํ ๊ณณ ํ๋๋ผ๋ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด
+ // * ํด๋น ์์น๋ฅผ ๋ฐฉ๋ฌธํ์ ํ ํ์ ์ฝ์
+ for (int[] l: light[cur[0]][cur[1]]) {
+ for (int i = 0; i < 4; i++) {
+ int nx = l[0] + dx[i];
+ int ny = l[1] + dy[i];
+
+ if (nx < 1 || ny < 1 || nx > n || ny > n) {
+ continue;
+ }
+
+ if (!visited[l[0]][l[1]]) {
+ if (visited[nx][ny]) {
+ visited[l[0]][l[1]] = true;
+ queue.add(new int[] {l[0], l[1]});
+ break;
+ }
+ }
+ }
+ }
+
+ // * ์ธ์ ํ ๊ณณ์ด ๋ถ์ด ์ผ์ ธ์๊ณ ๋ฐฉ๋ฌธํ์ง ์์ผ๋ฉด ๋ฐฉ๋ฌธํ์ ํ ํ์ ์ฝ์
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 1 || ny < 1 || nx > n || ny > n) {
+ continue;
+ }
+
+ if (!visited[nx][ny] && lightOn[nx][ny]) {
+ visited[nx][ny] = true;
+ queue.add(new int[] {nx, ny});
+ }
+ }
+ }
+ }
+
+ // ! ๋ชจ๋ ๋ฐฉ์ ๋ถ์ ์ผ์ง ๊ฐ์๋ฅผ ์ธ๋ ํจ์
+ public static int count() {
+ int c = 0;
+ for (int i = 1; i < n+1; i++) {
+ for (int j =1 ; j < n+1; j++) {
+ if (lightOn[i][j]) {
+ c++;
+ }
+ }
+ }
+ return c;
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ light = new ArrayList[n+1][n+1];
+ visited = new boolean[n+1][n+1];
+ lightOn = new boolean[n+1][n+1];
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ light[i][j] = new ArrayList<>();
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int x = Integer.parseInt(st.nextToken());
+ int y = Integer.parseInt(st.nextToken());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ light[x][y].add(new int[] {a, b});
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/II/G2_12015.java b/java/BOJ/Gold/II/G2_12015.java
new file mode 100644
index 0000000..c793ad8
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_12015.java
@@ -0,0 +1,97 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/12015
+ *
+ * ! ์ ๋ชฉ: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 โค N โค 1,000,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 โค Ai โค 1,000,000)
+ *
+ * 6 -> n
+ * 10 20 10 30 20 50 -> arr
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 508ms
+ * ๋ฉ๋ชจ๋ฆฌ: 125412KB
+ * ์ธ์ด: JAVA8
+*/
+package Gold.II;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G2_12015 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, arr[];
+
+ // ์ด๊ธฐ ์ค์
+ static int length;
+ static int[] answer;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ search(); // * ์ด๋ถ ํ์์ ์ด์ฉํ LIS
+
+ bw.write(String.valueOf(length)); // * LIS ๊ธธ์ด ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์ด๋ถํ์์ ์ด์ฉํ LIS
+ public static void search() {
+ answer = new int[n];
+
+ answer[0] = arr[0];
+ length = 1;
+
+ for (int i = 1; i < n; i++) {
+ if (answer[length-1] < arr[i]) {
+ answer[length++] = arr[i];
+ } else {
+ int left = 0;
+ int right = length-1;
+
+ while (left < right) {
+ int mid = (left + right) / 2;
+ if (answer[mid] < arr[i]) {
+ left = mid + 1;
+ } else {
+ right = mid;
+ }
+ }
+
+ answer[left] = arr[i];
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_1202.java b/java/BOJ/Gold/II/G2_1202.java
new file mode 100644
index 0000000..82c44d3
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_1202.java
@@ -0,0 +1,112 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/1202
+ *
+ * ! ์ ๋ชฉ: ๋ณด์ ๋๋
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ! ๋ฌธ์
+ * ์ธ๊ณ์ ์ธ ๋๋ ์๋์ด๋ ๋ณด์์ ์ ํธ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค.
+ * ์๋์ด๊ฐ ํธ ๋ณด์์ ์๋ ๋ณด์์ด ์ด N๊ฐ ์๋ค. ๊ฐ ๋ณด์์ ๋ฌด๊ฒ Mi์ ๊ฐ๊ฒฉ Vi๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์๋์ด๋ ๊ฐ๋ฐฉ์ K๊ฐ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ ๊ฐ๋ฐฉ์ ๋ด์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ๋ Ci์ด๋ค. ๊ฐ๋ฐฉ์๋ ์ต๋ ํ ๊ฐ์ ๋ณด์๋ง ๋ฃ์ ์ ์๋ค.
+ * ์๋์ด๊ฐ ํ์น ์ ์๋ ๋ณด์์ ์ต๋ ๊ฐ๊ฒฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ค. (1 โค N, K โค 300,000)
+ * ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ๋ณด์์ ์ ๋ณด Mi์ Vi๊ฐ ์ฃผ์ด์ง๋ค. (0 โค Mi, Vi โค 1,000,000)
+ * ๋ค์ K๊ฐ ์ค์๋ ๊ฐ๋ฐฉ์ ๋ด์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ Ci๊ฐ ์ฃผ์ด์ง๋ค. (1 โค Ci โค 100,000,000)
+ * ๋ชจ๋ ์ซ์๋ ์์ ์ ์์ด๋ค.
+ *
+ * 3 2 -> n m
+ * 1 65 -> jewels.get(0)
+ * 5 23 -> ...
+ * 2 99 -> jewels.get(n-1)
+ * 10 -> bags.get(0)
+ * 2 -> bags.get(m-1)
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์๋์ด๊ฐ ํ์น ์ ์๋ ๋ณด์ ๊ฐ๊ฒฉ์ ํฉ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 164
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 1760ms
+ * ๋ฉ๋ชจ๋ฆฌ: 155316KB
+ * ์ธ์ด: JAVA8
+*/
+package Gold.II;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+
+public class G2_1202 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n;
+ static int m;
+ static ArrayList jewels = new ArrayList<>();
+ static ArrayList bags = new ArrayList<>();
+ static long weight = 0L;
+
+ public static void main(String[] args) throws IOException {
+ input(); // ์
๋ ฅ ๋ฐ๊ธฐ
+ steal(); // ๋ณด์ ํ์น๊ธฐ
+ bw.write(String.valueOf(weight)); // ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // * ๋ณด์ ํ์น๊ธฐ
+ public static void steal() {
+ int idx = 0; // ๋ฌด๊ฒ๊ฐ ์์ ์์์ ๋ณด์๋๋ก
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> b - a); // ํ์น ์ ์๋ ๋ณด์๋ค
+
+ // ์ต๋๋ก ๋ด์ ์ ์๋ ๋ฌด๊ฒ๊ฐ ์์ ๊ฐ๋ฐฉ ์์๋๋ก
+ for (int i = 0; i < m; i++) {
+
+ int limitWeight = bags.get(i);
+
+ // ! ํ์ฌ ๊ฐ๋ฐฉ์์ ํ์น ์ ์๋ ๋ณด์๋ค์ ์ต๋ํ(pq)์ ๋ชจ๋ ๋ด์
+ // ! => ๋ค์์ ๊ฐ๋ฐฉ์์๋ ํด๋น ๋ณด์์ ๋ชจ๋ ๋ด์ ์ ์๋ค.
+ // ! => ๊ทธ ์ค์ ๊ฐ์น๊ฐ ์ ์ผ ๋์ ๋ณด์์ ์ฐ์ ์ผ๋ก ์ฑ๊น(Greedy)
+ while (idx < n && jewels.get(idx)[0] <= limitWeight) {
+ pq.add(jewels.get(idx)[1]);
+ idx++;
+ }
+
+ if (!pq.isEmpty()) {
+ weight += pq.poll();
+ }
+ }
+ }
+
+ // * ์
๋ ฅ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ jewels.add(new int[] {a, b});
+ }
+
+ jewels.sort((a, b) -> a[0] - b[0]);
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ bags.add(Integer.parseInt(st.nextToken()));
+ }
+
+ bags.sort((a, b) -> a - b);
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_1256.java b/java/BOJ/Gold/II/G2_1256.java
new file mode 100644
index 0000000..880759e
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_1256.java
@@ -0,0 +1,100 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1256
+ *
+ * ? ์ ๋ชฉ: ์ฌ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ํธ์ ๊ท์์ด๋ 212ํธ์์ ๋ฌธ์์ด์ ๋ํด ๊ณต๋ถํ๊ณ ์๋ค. ๊น์ง์ ์กฐ๊ต๋ ๋ํธ์ ๊ท์์ด์๊ฒ ํน๋ณ ๊ณผ์ ๋ฅผ ์ฃผ์๋ค. ํน๋ณ ๊ณผ์ ๋ ํน๋ณํ ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด ์ง ์ฌ์ ์ ๋ง๋๋ ๊ฒ์ด๋ค. ์ฌ์ ์ ์๋ก๋์ด ์๋ ๋ชจ๋ ๋ฌธ์์ด์ N๊ฐ์ "a"์ M๊ฐ์ "z"๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ฌธ์๋ ์๋ค. ์ฌ์ ์๋ ์ํ๋ฒณ ์์๋๋ก ์๋ก๋์ด ์๋ค.
+ * ๊ท์์ด๋ ์ฌ์ ์ ์์ฑํ์ง๋ง, ๋ํธ๋ ์ฌ์ ์ ์์ฑํ์ง ๋ชปํ๋ค. ๋ํธ๋ ์์ ์ ๊ณผ์ ๋ฅผ ๋๋ด๊ธฐ ์ํด์ ๊ท์์ด์ ์ฌ์ ์ ๋ชฐ๋ ์ฐธ์กฐํ๊ธฐ๋ก ํ๋ค. ๋ํธ๋ ๊ท์์ด๊ฐ ์๋ฆฌ๋ฅผ ๋น์ด ์ฌ์ด์ ๋ชฐ๋ ์ฌ์ ์ ๋ณด๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์, ๋ฌธ์์ด ํ๋๋ง ์ฐพ์ ์ฌ์ ๋ฐ์ ์๋ค.
+ * N๊ณผ M์ด ์ฃผ์ด์ก์ ๋, ๊ท์์ด์ ์ฌ์ ์์ K๋ฒ์งธ ๋ฌธ์์ด์ด ๋ฌด์์ธ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ธ ์ ์ N, M, K๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 2 2 2 -> n m k
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ท์์ด์ ์ฌ์ ์์ K๋ฒ์งธ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๊ท์์ด์ ์ฌ์ ์ ์๋ก๋์ด ์๋ ๋ฌธ์์ด์ ๊ฐ์๊ฐ K๋ณด๋ค ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * azaz
+ *
+ * ? ์ ํ
+ * 1 โค N, M โค 100
+ * 1 โค K โค 1,000,000,000
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.124์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 14MB
+ * * ์ธ์ด: JAVA11
+ * * ์๋: 4
+ */
+package Gold.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G2_1256 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m, k;
+ static int MAX = 1_000_000_000;
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= m; j++) {
+ dp[i][j] = Math.min(dp[i - 1][j] + dp[i][j - 1], MAX);
+ }
+ }
+
+ if (dp[n][m] < k) {
+ System.out.println(-1);
+ } else {
+ StringBuffer sb = new StringBuffer();
+
+ while (true) {
+ if (n == 0 || m == 0) {
+ sb.append("z".repeat(m));
+ sb.append("a".repeat(n));
+ break;
+ }
+
+ if (dp[n - 1][m] >= k) {
+ sb.append("a");
+ n--;
+ } else {
+ sb.append("z");
+ k -= dp[n - 1][m];
+ m--;
+ }
+ }
+
+ System.out.println(sb);
+ }
+
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ dp = new int[n + 1][m + 1];
+ for (int i = 0; i <= n; i++) {
+ dp[i][0] = 1;
+ }
+
+ for (int i = 0; i <= m; i++) {
+ dp[0][i] = 1;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_13459.java b/java/BOJ/Gold/II/G2_13459.java
new file mode 100644
index 0000000..66073e1
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_13459.java
@@ -0,0 +1,182 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/13459
+ *
+ * ! ์ ๋ชฉ: ๊ตฌ์ฌ ํ์ถ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ์คํํธ๋งํฌ์์ ํ๋งคํ๋ ์ด๋ฆฐ์ด์ฉ ์ฅ๋๊ฐ ์ค์์ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง์ ์ ํ์ ๊ตฌ์ฌ ํ์ถ์ด๋ค. ๊ตฌ์ฌ ํ์ถ์ ์ง์ฌ๊ฐํ ๋ณด๋์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํ๋์ฉ ๋ฃ์ ๋ค์, ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ด๋ ๊ฒ์์ด๋ค.
+ * ๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ๋ N, ๊ฐ๋ก ํฌ๊ธฐ๋ M์ด๊ณ , ํธ์์ 1ร1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ ํ๊ณผ ์ด์ ๋ชจ๋ ๋งํ์ ธ ์๊ณ , ๋ณด๋์๋ ๊ตฌ๋ฉ์ด ํ๋ ์๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ๋ณด๋์์ 1ร1ํฌ๊ธฐ์ ์นธ์ ๊ฐ๋ ์ฑ์ฐ๋ ์ฌ์ด์ฆ์ด๊ณ , ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด๊ฐ ์๋ค. ๊ฒ์์ ๋ชฉํ๋ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด์ ๋นผ๋ด๋ ๊ฒ์ด๋ค. ์ด๋, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค.
+ * ์ด๋, ๊ตฌ์ฌ์ ์์ผ๋ก ๊ฑด๋๋ฆด ์๋ ์๊ณ , ์ค๋ ฅ์ ์ด์ฉํด์ ์ด๋ฆฌ ์ ๋ฆฌ ๊ตด๋ ค์ผ ํ๋ค. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์๋์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ค ๊ฐ์ง ๋์์ด ๊ฐ๋ฅํ๋ค.
+ * ๊ฐ๊ฐ์ ๋์์์ ๊ณต์ ๋์์ ์์ง์ธ๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋น ์ ธ๋ ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋์์ ๊ฐ์ ์นธ์ ์์ ์ ์๋ค. ๋, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ํ ์นธ์ ๋ชจ๋ ์ฐจ์งํ๋ค. ๊ธฐ์ธ์ด๋ ๋์์ ๊ทธ๋งํ๋ ๊ฒ์ ๋ ์ด์ ๊ตฌ์ฌ์ด ์์ง์ด์ง ์์ ๋ ๊น์ง์ด๋ค.
+ * ๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, 10๋ฒ ์ดํ๋ก ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์๋ ๋ณด๋์ ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 โค N, M โค 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ ๋ณด๋์ ๋ชจ์์ ๋ํ๋ด๋ ๊ธธ์ด M์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ '.', '#', 'O', 'R', 'B' ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. '.'์ ๋น ์นธ์ ์๋ฏธํ๊ณ , '#'์ ๊ณต์ด ์ด๋ํ ์ ์๋ ์ฅ์ ๋ฌผ ๋๋ ๋ฒฝ์ ์๋ฏธํ๋ฉฐ, 'O'๋ ๊ตฌ๋ฉ์ ์์น๋ฅผ ์๋ฏธํ๋ค. 'R'์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์น, 'B'๋ ํ๋ ๊ตฌ์ฌ์ ์์น์ด๋ค.
+ * ์
๋ ฅ๋๋ ๋ชจ๋ ๋ณด๋์ ๊ฐ์ฅ์๋ฆฌ์๋ ๋ชจ๋ '#'์ด ์๋ค. ๊ตฌ๋ฉ์ ๊ฐ์๋ ํ ๊ฐ ์ด๋ฉฐ, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํญ์ 1๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 5 5 -> n m
+ * ##### -> arr[0][0] ~ arr[0][m-1]
+ * #..B#
+ * #.#.#
+ * #RO.#
+ * ##### -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ํ๋ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ๋ฃ์ง ์์ผ๋ฉด์ ๋นจ๊ฐ ๊ตฌ์ฌ์ 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นผ๋ผ ์ ์์ผ๋ฉด 1์ ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ! ์ฑ์ ๊ฒฐ๊ณผ
+ * ? ์๊ฐ: 80ms
+ * ? ๋ฉ๋ชจ๋ฆฌ: 118MB
+ * ? ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class G2_13459 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ + ๋นจ๊ฐ๊ตฌ์ฌ + ํ๋๊ตฌ์ฌ + ๊ตฌ๋ฉ ์์น
+ static int n, m;
+ static int[] red, blue, hole;
+ static char[][] arr;
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {-1, 1, 0, 0};
+ static int[] dy = {0, 0, -1, 1};
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean result = false;
+ static boolean[][][][] visited;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ๋ฐ๊ธฐ
+ findBead(); // * ๊ตฌ์ฌ๊ณผ ๊ตฌ๋ฉ ์์น ์ฐพ๊ธฐ
+ bfs(); // * BFS ์ํ
+
+ bw.write(String.valueOf(result ? 1 : 0)); // * ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {red[0], red[1], blue[0], blue[1], 0}); // ํ์ ์ฝ์
+ visited[red[0]][red[1]][blue[0]][blue[1]] = true; // ๋นจ๊ฐ๊ตฌ์ฌ ํ๋๊ตฌ์ฌ ์์น ๋ฐฉ๋ฌธํ์
+
+ // BFS ์ํ
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll(); // [๋นจ๊ฐ๊ตฌ์ฌํ, ๋นจ๊ฐ๊ตฌ์ฌ์ด, ํ๋๊ตฌ์ฌํ, ํ๋๊ตฌ์ฌ์ด, ์์ง์ธํ์]
+ int count = cur[4]; // ์์ง์ธ ํ์
+
+ // ํ๋๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ก์ผ๋ฉด ํจ์ค
+ if (holeCheck(cur[2], cur[3])) {
+ continue;
+ } else {
+ // ํ๋๊ตฌ์ฌ์ด ๋น ์ง์ง ์์์ผ๋ฉด์ ๋นจ๊ฐ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ก์ผ๋ฉด ์ฑ๊ณต ๋ฐ ์ข
๋ฃ
+ if (holeCheck(cur[0], cur[1])) {
+ result = true;
+ break;
+ }
+ }
+
+ if (count == 11) break; // ์ด๋ํ์๊ฐ 11์ด ๋ ์์ ์์ ๋ชจ๋ ์ข
๋ฃ
+
+ for (int i = 0; i < 4; i++) {
+ int[] next = move(cur, i); // * ์ํ์ข์ฐ๋ก ๊ธฐ์ธ์ด๊ธฐ
+
+ // ๊ธฐ์ธ์ฌ์ ์๊ธด ์์น๊ฐ ํ๋ฒ๋ ๋์จ์ ์ด ์๋ค๋ฉด ๋ฐฉ๋ฌธํ์ ํ ํ์ ์ฝ์
+ if (!visited[next[0]][next[1]][next[2]][next[3]]) {
+ visited[next[0]][next[1]][next[2]][next[3]] = true;
+ queue.add(new int[] {next[0], next[1], next[2], next[3], count+1});
+ }
+ }
+ }
+ }
+
+ // ! ๊ตฌ๋ฉ์ ๋น ์ก๋์ง ์ฒดํฌํ๋ ํจ์
+ public static boolean holeCheck(int x, int y) {
+ if (x == hole[0] && y == hole[1]) {
+ return true;
+ }
+ return false;
+ }
+
+ // ! ๊ธฐ์ธ์ฌ์ ๋นจ๊ฐ๊ตฌ์ฌ๊ณผ ํ๋๊ตฌ์ฌ์ ์์ง์ด๋ ํจ์ - 0(์) 1(ํ) 2(์ข) 3(์ฐ)
+ public static int[] move(int[] cur, int dir) {
+ int[] red = new int[] {cur[0], cur[1]}; // ๋นจ๊ฐ ๊ตฌ์ฌ ์์น
+ int[] blue = new int[] {cur[2], cur[3]}; // ํ๋ ๊ตฌ์ฌ ์์น
+
+ // * dir(0~3)์ ๋ฐ๋ผ ์์ง์ด๋ ๋ค์ ์์น๊ฐ ์๋ ์กฐ๊ฑด์ ๋ง์กฑํ ๋
+ // * (๋ค์์ด .[๊ฐ ์ ์๋ ์์น] ์ด๋ฉด์) && (ํ์ฌ ์์น๊ฐ ๊ตฌ๋ฉ์ด ์๋๋ฉด์) && (๋ค์์ผ๋ก ๊ฐ๋๊ฒ ๊ตฌ๋ฉ์ ๋น ์ง์ง ์์ ์ํ์ ๋ธ๋ฃจ๋ ๊ฒน์น์ง ์๋ ๊ฒฝ์ฐ)
+ // * ๋นจ๊ฐ๊ตฌ์ฌ ์กฐ๊ฑด || ํ๋๊ตฌ์ฌ ์กฐ๊ฑด
+ while ((arr[red[0] + dx[dir]][red[1] + dy[dir]] == '.' && !(red[0] == hole[0] && red[1] == hole[1]) && !(!(blue[0] == hole[0] && blue[1] == hole[1]) && red[0] + dx[dir] == blue[0] && red[1] + dy[dir] == blue[1]))
+ ||
+ (arr[blue[0] + dx[dir]][blue[1] + dy[dir]] == '.' && !(blue[0] == hole[0] && blue[1] == hole[1]) && !(!(red[0] == hole[0] && red[1] == hole[1]) && blue[0] + dx[dir] == red[0] && blue[1] + dy[dir] == red[1]))) {
+
+ // * ์ while๋ฌธ์ ๋นจ๊ฐ๊ตฌ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ๋นจ๊ฐ๊ตฌ์ฌ ์ด๋
+ if (arr[red[0] + dx[dir]][red[1] + dy[dir]] == '.'
+ && !(red[0] == hole[0] && red[1] == hole[1])
+ && !(!(blue[0] == hole[0] && blue[1] == hole[1]) && red[0] + dx[dir] == blue[0] && red[1] + dy[dir] == blue[1])) {
+ red[0] += dx[dir];
+ red[1] += dy[dir];
+ }
+
+ // * ์ while๋ฌธ์ ํ๋๊ตฌ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ํ๋๊ตฌ์ฌ ์ด๋
+ if (arr[blue[0] + dx[dir]][blue[1] + dy[dir]] == '.'
+ && !(blue[0] == hole[0] && blue[1] == hole[1])
+ && !(!(red[0] == hole[0] && red[1] == hole[1]) && blue[0] + dx[dir] == red[0] && blue[1] + dy[dir] == red[1])) {
+ blue[0] += dx[dir];
+ blue[1] += dy[dir];
+ }
+ }
+
+ // * ์ต์ข
์์น ๋ฆฌํด
+ return new int[] {red[0], red[1], blue[0], blue[1]};
+ }
+
+ // ! ๋นจ๊ฐ๊ตฌ์ฌ, ํ๋๊ตฌ์ฌ, ๊ตฌ๋ฉ ์์น ์ฐพ๊ธฐ
+ public static void findBead() {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (arr[i][j] == 'R') {
+ red = new int[] {i, j};
+ arr[i][j] = '.';
+ } else if (arr[i][j] == 'B') {
+ blue = new int[] {i, j};
+ arr[i][j] = '.';
+ } else if (arr[i][j] == 'O') {
+ hole = new int[] {i, j};
+ arr[i][j] = '.';
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ String[] s = br.readLine().split(" ");
+ n = Integer.parseInt(s[0]);
+ m = Integer.parseInt(s[1]);
+
+ arr = new char[n][m];
+ visited = new boolean[n][m][n][m];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_14867.java b/java/BOJ/Gold/II/G2_14867.java
new file mode 100644
index 0000000..8c0c624
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_14867.java
@@ -0,0 +1,182 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14867
+ *
+ * ? ์ ๋ชฉ: ๋ฌผํต
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ฉ๋์ด ๋ค๋ฅธ ๋ ๊ฐ์ ๋น ๋ฌผํต A, B๊ฐ ์๋ค. ์ด ๋ฌผํต๋ค์ ๋ฌผ์ ์ฑ์ฐ๊ณ ๋น์ฐ๋ ์ผ์ ๋ฐ๋ณตํ์ฌ ๋ ๋ฌผํต์ ์ํ๋ ์ํ(๋ชฉํํ๋ ์์ ๋ฌผ์ ๋ด์ ์ํ)๊ฐ ๋๋๋ก ๋ง๋ค๊ณ ์ ํ๋ค. ๋ฌผํต ์ด์ธ์๋ ๋ฌผ์ ์์ ์ ํํ ์ด ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ, ๊ฐ๋ฅํ ์์
์ ๋ค์๊ณผ ๊ฐ์ ์ธ ์ข
๋ฅ๊ฐ ์ ๋ถ์ด๋ค.
+ * [F(x): Fill x]: ๋ฌผํต x์ ๋ฌผ์ ๊ฐ๋ ์ฑ์ด๋ค. (๋ฌผ์ ์ฑ์ฐ๊ธฐ ์ ์ ๋ฌผํต x๊ฐ ๋น์ด์๋์ง ์ฌ๋ถ๋ ๊ด๊ณ์์. ๋ค๋ฅธ ๋ฌผํต์ ๊ทธ๋๋ก ๋ )
+ * [E(x): Empty x]: ๋ฌผํต x์ ๋ฌผ์ ๋ชจ๋ ๋ฒ๋ฆฐ๋ค. (๋ค๋ฅธ ๋ฌผํต์ ๊ทธ๋๋ก ๋ )
+ * [M(x,y): Move water from x to y)]: ๋ฌผํต x์ ๋ฌผ์ ๋ฌผํต y์ ๋ถ๋๋ค. ์ด๋ ๋ง์ฝ ๋ฌผํต x์ ๋จ์ ์๋ ๋ฌผ์ ์์ด ๋ฌผํต y์ ๋จ์ ์๋ ๋น ๊ณต๊ฐ๋ณด๋ค ์ ๊ฑฐ๋ ๊ฐ๋ค๋ฉด ๋ฌผํต x์ ๋ฌผ์ ๋ฌผํต y์ ๋ชจ๋ ๋ถ๋๋ค. ๋ง์ฝ ๋ฌผํต x์ ๋จ์ ์๋ ๋ฌผ์ ์์ด ๋ฌผํต y์ ๋จ์ ์๋ ๋น ๊ณต๊ฐ๋ณด๋ค ๋ง๋ค๋ฉด ๋ถ์ ์ ์๋ ๋งํผ ์ต๋๋ก ๋ถ์ด ๋ฌผํต y๋ฅผ ๊ฝ ์ฑ์ฐ๊ณ ๋๋จธ์ง๋ ๋ฌผํต x์ ๋จ๊ธด๋ค.
+ * ์๋ฅผ ๋ค์ด, ๋ฌผํต A์ B์ ์ฉ๋์ด ๊ฐ๊ฐ 2๋ฆฌํฐ์ 5๋ฆฌํฐ๋ผ๊ณ ํ์. ๋ ๋ฌผํต ๋ชจ๋ ๋น ์ํ์์ ์์ํ์ฌ ์ต์ข
์ ์ผ๋ก ๋ฌผํต A์๋ 2๋ฆฌํฐ, ๋ฌผํต B์๋ 4๋ฆฌํฐ ๋ฌผ์ ๋จ๊ธฐ๊ธธ ์ํ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์์
์ ์ํํ๋ฉด ์ด 8ํ์ ์์
์ผ๋ก ์ํ๋ ์ํ์ ๋๋ฌํ ์ ์๋ค.
+ * (0,0)โ[F(B)]โ(0,5)โ[M(B,A)]โ(2,3)โ[E(A)]โ(0,3)โ[M(B,A)]โ(2,1)โ[E(A)]โ(0,1)โ[M(B,A)]โ(1,0)โ[F(B)]โ(1,5)โ[M(B,A)]โ(2,4)
+ * ํ์ง๋ง, ์์
์์๋ฅผ ์๋์ ๊ฐ์ด ํ๋ค๋ฉด ํ์ํ ์์
์ด ์๊ฐ 5ํ๊ฐ ๋๋ค.
+ * (0,0)โ[F(A)]โ(2,0)โ[M(A,B)]โ(0,2)โ[F(A)]โ(2,2)โ[M(A,B)]โ(0,4)โ[F(A)]โ(2,4)
+ * ๋ ๋ฌผํต์ ์ฉ๋๊ณผ ์ํ๋ ์ต์ข
์ํ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ํ, ๋ ๋ฌผํต์ด ๋น์ด ์๋ ์ํ์์ ์์ํ์ฌ ์ต์ข
์ํ์ ๋๋ฌํ๊ธฐ ์ํ ์ต์ ์์
์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ํ์ค ์
๋ ฅ์ผ๋ก ๋ฌผํต A์ ์ฉ๋์ ๋ํ๋ด๋ ์ ์ a(1 โค a < 100,000), ๋ฌผํต B์ ์ฉ๋์ ๋ํ๋ด๋ ์ ์ b(a < b โค 100,000), ์ต์ข
์ํ์์ ๋ฌผํต A์ ๋จ๊ฒจ์ผ ํ๋ ๋ฌผ์ ์ฉ๋์ ๋ํ๋ด๋ ์ ์ c(0 โค c โค a), ์ต์ข
์ํ์์ ๋ฌผํต B์ ๋จ๊ฒจ์ผ ํ๋ ๋ฌผ์ ์ฉ๋์ ๋ํ๋ด๋ ์ ์ d(0 โค d โค b)๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ํ ์ค์ ์ฃผ์ด์ง๋ค.
+ *
+ * 3 7 3 2 -> aMax bMax aEnd bEnd
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ชฉํ ์ํ์ ๋๋ฌํ๋ ์ต์ ์์
์๋ฅผ ๋ํ๋ด๋ ์ ์๋ฅผ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋ชฉํ ์ํ์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด โ1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 9
+ *
+ * ? ์๋ธํ์คํฌ
+ * ๋ฒํธ ๋ฐฐ์ ์ ํ
+ * 1 9 A ๋ฌผํต์ ์ฉ๋์ 1๋ฆฌํฐ
+ * 2 14 B ๋ฌผํต์ ์ฉ๋์ A ๋ฌผํต์ ์ฉ๋์ ๋ฐฐ์
+ * 3 34 1 โค a, b โค 1,000
+ * 4 43 ์๋์ ์ ์ฝ์กฐ๊ฑด ์ด์ธ์ ์๋ฌด ์ ์ฝ์กฐ๊ฑด์ด ์๋ค.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 1140ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 234MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.*;
+
+public class G2_14867 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int aMax;
+ static int bMax;
+ static int aEnd;
+ static int bEnd;
+
+ // * ์ด๊ธฐ ์ค์
+ static HashSet visited = new HashSet<>(); // ๋ฐฉ๋ฌธ ํด์ฌ์
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ st = new StringTokenizer(br.readLine());
+ aMax = Integer.parseInt(st.nextToken());
+ bMax = Integer.parseInt(st.nextToken());
+ aEnd = Integer.parseInt(st.nextToken());
+ bEnd = Integer.parseInt(st.nextToken());
+
+ // * 2. BFS ์ํ
+ int answer = bfs();
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(answer);
+ }
+
+ /*
+ 1. A ๋น์ฐ๊ธฐ
+ 2. B ๋น์ฐ๊ธฐ
+ 3. A ๊ฐ๋์ฑ์ฐ๊ธฐ
+ 4. B ๊ฐ๋์ฑ์ฐ๊ธฐ
+ 5. A -> B
+ 6. B -> A
+ */
+
+ // ! BFS
+ public static int bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {0, 0, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ // ์ ๋ต
+ if (cur[0] == aEnd && cur[1] == bEnd) {
+ return cur[2];
+ }
+
+ // 1
+ if (cur[0] != 0) {
+ if (!isVisited(0, cur[1])) {
+ queue.add(new int[] {0, cur[1], cur[2]+1});
+ }
+ }
+
+ // 2
+ if (cur[1] != 0) {
+ if (!isVisited(cur[0], 0)) {
+ queue.add(new int[] {cur[0], 0, cur[2]+1});
+ }
+ }
+
+ // 3
+ if (cur[0] != aMax) {
+ if (!isVisited(aMax, cur[1])) {
+ queue.add(new int[] {aMax, cur[1], cur[2]+1});
+ }
+ }
+
+ // 4
+ if (cur[1] != bMax) {
+ if (!isVisited(cur[0], bMax)) {
+ queue.add(new int[] {cur[0], bMax, cur[2]+1});
+ }
+
+ }
+
+ // 5
+ if (cur[0] != 0) {
+ int[] next = moveAtoB(cur[0], cur[1], cur[2]);
+ if (!isVisited(next[0], next[1])) {
+ queue.add(next);
+ }
+ }
+
+ // 6
+ if (cur[1] != 0) {
+ int[] next = moveBtoA(cur[0], cur[1], cur[2]);
+ if (!isVisited(next[0], next[1])) {
+ queue.add(next);
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ // ! HashSet์ ์ด์ฉํ์ฌ ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋์ง ํ์ธํ๊ณ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธํ์ํ๊ณ true๋ฅผ ๋ฆฌํดํ๋ ํจ์
+ public static boolean isVisited(int a, int b) {
+ String v = a + "," + b;
+ if (visited.contains(v)) {
+ return true;
+ }
+ visited.add(v);
+ return false;
+ }
+
+ // ! A์ ์๋ ๋ฌผ์ B๋ก ์ฎ๊ธฐ๋ ํจ์
+ public static int[] moveAtoB(int a, int b, int c) {
+ if (a + b > bMax) {
+ a -= (bMax - b);
+ b = bMax;
+ } else {
+ b += a;
+ a = 0;
+ }
+
+ return new int[] {a, b, c+1};
+ }
+
+ // ! B์ ์๋ ๋ฌผ์ A๋ก ์ฎ๊ธฐ๋ ํจ์
+ public static int[] moveBtoA(int a, int b, int c) {
+ if (a + b > aMax) {
+ b -= (aMax - a);
+ a = aMax;
+ } else {
+ a += b;
+ b = 0;
+ }
+
+ return new int[] {a, b, c+1};
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_1507.java b/java/BOJ/Gold/II/G2_1507.java
new file mode 100644
index 0000000..eaf5f23
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_1507.java
@@ -0,0 +1,106 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/1507
+ *
+ * ! ์ ๋ชฉ: ๊ถ๊ธํ ๋ฏผํธ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * ๊ฐํธ๋ N๊ฐ์ ๋์๋ก ์ด๋ฃจ์ด์ง ๋๋ผ์ ์ด๊ณ ์๋ค. ๊ฐ ๋์๋ M๊ฐ์ ๋๋ก๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ๊ฐ ๋๋ก๋ฅผ ์ง๋ ๋ ํ์ํ ์๊ฐ์ด ์กด์ฌํ๋ค. ๋๋ก๋ ์ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋์ A์์ B๋ก ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ์ง ์๋๋ค.
+ * ๋์ A์์ ๋์ B๋ก ๋ฐ๋ก ๊ฐ ์ ์๋ ๋๋ก๊ฐ ์๊ฑฐ๋, ๋ค๋ฅธ ๋์๋ฅผ ๊ฑฐ์ณ์ ๊ฐ ์ ์์ ๋, ๋์ A์์ B๋ฅผ ๊ฐ ์ ์๋ค๊ณ ํ๋ค.
+ * ๊ฐํธ๋ ๋ชจ๋ ์์ ๋์์ ๋ํด์ ์ต์ ์ด๋ ์๊ฐ์ ๊ตฌํด๋์๋ค. ๋ฏผํธ๋ ์ด ํ๋ฅผ ๋ณด๊ณ ์๋ ๋๋ก๊ฐ ๋ช ๊ฐ ์๋์ง๋ฅผ ๊ตฌํด๋ณด๋ ค๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์์ ์ ๊ฒฝ์ฐ์ ๋ชจ๋ ๋์ ์ฌ์ด์ ๊ฐํธ๊ฐ ๊ตฌํ ๊ฐ์ ๊ฐ์ง๋ ๋๋ก๊ฐ ์กด์ฌํ๋ค๊ณ ํด๋ ๋๋ค. ํ์ง๋ง, ์ด ๋๋ก์ ๊ฐ์๋ ์ต์๊ฐ์ด ์๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ 1-2, 2-3, 1-4, 3-4, 4-5, 3-5๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก๋ง ์๋ค๊ณ ๊ฐ์ ํด๋, ๊ฐํธ๊ฐ ๊ตฌํ ๋ชจ๋ ์์ ์ต์๊ฐ์ ๊ตฌํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ๋๋ก์ ๊ฐ์๋ 6๊ฐ์ด๊ณ , ๋ชจ๋ ๋๋ก์ ์๊ฐ์ ํฉ์ 55์ด๋ค.
+ * ๋ชจ๋ ์์ ๋์ ์ฌ์ด์ ์ต์ ์ด๋ ์๊ฐ์ด ์ฃผ์ด์ก์ ๋, ์ด ๋๋ผ์ ์กด์ฌํ ์ ์๋ ๋๋ก์ ๊ฐ์์ ์ต์๊ฐ์ผ ๋, ๋ชจ๋ ๋๋ก์ ์๊ฐ์ ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N(1 โค N โค 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ๊ฐ์ ๋์ ์ฌ์ด์ ์ด๋ํ๋๋ฐ ํ์ํ ์๊ฐ์ด ์ฃผ์ด์ง๋ค. A์์ B๋ก ๊ฐ๋ ์๊ฐ๊ณผ B์์ A๋ก ๊ฐ๋ ์๊ฐ์ ๊ฐ๋ค. ๋, A์ B๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ 0์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ์ ํ์ํ ์๊ฐ์ 2500๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 5 -> n
+ * 0 6 15 2 6 -> arr[0][0] ~ arr[0][n-1]
+ * 6 0 9 8 12
+ * 15 9 0 16 18
+ * 2 8 16 0 4
+ * 6 12 18 4 0 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋๋ก ๊ฐ์๊ฐ ์ต์์ผ ๋, ๋ชจ๋ ๋๋ก์ ์๊ฐ์ ํฉ์ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 55
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 84ms
+ * ๋ฉ๋ชจ๋ฆฌ: 11688KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G2_1507 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, arr[][];
+
+ // ์ด๊ธฐ ์ค์
+ static int total = 0; // ๋๋ก์ ๊ฐ์๊ฐ ์ต์๊ฐ์ผ ๋, ๋ชจ๋ ๋๋ก์ ์๊ฐ์ ํฉ
+ static boolean[][] minRoad; // ๋๋ก์ ๊ฐ์๊ฐ ์ต์๊ฐ์ด ๋๊ธฐ ์ํด ์ ํํ์ง ๋ง์์ผ ํ ๋๋ก(true๊ฐ์ด๋ฉด ์ ํํ์ง ์์)
+ static boolean result = true; // ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์๋์ง ํ๋จ
+
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ floyd(); // * ํ๋ก์ด๋ ์์ฌ
+
+ // * minRoad์ ๊ฐ์ด true์ธ ๊ฐ์ ์ ์ธํ๊ณ ๋ชจ๋ ๋๋ก์ ๊ธธ์ด๋ฅผ ๋ํ๋ค(์ค๋ณต ์์ด)
+ for (int i = 0; i < n-1; i++) {
+ for (int j = i+1; j < n; j++) {
+ if (!minRoad[i][j]) total += arr[i][j];
+ }
+ }
+
+ bw.write(String.valueOf(result ? total : -1)); // * ์ถ๋ ฅ
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ํ๋ก์ด๋ ์์ฌ
+ public static void floyd() {
+ for (int k = 0; k < n; k++) {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (i == j || j == k || k == i) continue;
+
+ // * ํ๋ก์ด๋ ์์ฌ์ด ์ฑ๋ฆฝํ์ง ์๋ ๊ฒฝ์ฐ ์ข
๋ฃ
+ if (arr[i][j] > arr[i][k] + arr[k][j]) {
+ result = false;
+ return;
+ } else if (arr[i][j] == arr[i][k] + arr[k][j]) {
+ // * i -> j๋ก ๊ฐ๋ ์ต์๊ฑฐ๋ฆฌ์ i -> k -> j๋ก ๊ฐ๋ ์ต์๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๋ค๋ฉด
+ // * i -> j๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ํฌํจ์ํฌ ํ์ ์์(i -> k, k -> j๋ง ์ ํํด๋ ๋จ)
+ minRoad[i][j] = true;
+ }
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n][n];
+ minRoad = new boolean[n][n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_16985.java b/java/BOJ/Gold/II/G2_16985.java
new file mode 100644
index 0000000..bbd4395
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_16985.java
@@ -0,0 +1,221 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16985
+ *
+ * ? ์ ๋ชฉ: Maaaaaaaaaze
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ํํ๋กญ๊ฒ ๋ฌธ์ ๋ฅผ ๊ฒฝ์ํ๋ฉฐ ์ํํ๋ BOJ ๋ง์ ์ฌ๋๋ค์ ๋ ์ด์ 2์ฐจ์ ๋ฏธ๋ก์ ํฅ๋ฏธ๋ฅผ ๋๋ผ์ง ์๋๋ค. 2์ฐจ์ ๋ฏธ๋ก๋ ๋๋ฌด๋ ์ฝ๊ฒ ํ์ถ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฏธ๋ก๋ฅผ ์ด ์ธ์ ๊ทธ ๋๊ตฌ๋ณด๋ค ์ฌ๋ํ๋ ์คํ์ด๋ ์ด๋ฐ ์ํฉ์ ๋งค์ฐ ์ํ๊น๊ฒ ์ฌ๊ฒจ ์์ฃผ ํฐ ์๊ธ์ ๊ฑธ๊ณ BOJ ๋ง์ ์ฌ๋๋ค์ ๊ด์ฌ์ ํ ๋ ์ ์๋ 3์ฐจ์ ๋ฏธ๋ก ํ์ถ ๋ํ๋ฅผ ๊ฐ์ตํ๊ธฐ๋ก ํ๋ค.
+ * ๋ํ์ ๊ท์น์ ์๋์ ๊ฐ๋ค.
+ * 5ร5 ํฌ๊ธฐ์ ํ์ด 5๊ฐ ์ฃผ์ด์ง๋ค. ์ด์ค ์ผ๋ถ ์นธ์ ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๊ณ ์ผ๋ถ ์นธ์ ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ค. ๊ทธ๋ฆผ์์ ํ์ ์นธ์ ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์นธ์, ๊ฒ์ ์นธ์ ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์นธ์ ์๋ฏธํ๋ค.
+ * ์ฐธ๊ฐ์๋ ์ฃผ์ด์ง ํ๋ค์ ์๊ณ ๋ฐฉํฅ, ํน์ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์์ ๋กญ๊ฒ ํ์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ ํ์ ๋ค์ง์ ์๋ ์๋ค.
+ * ํ์ ์ ์๋ฃํ ํ ์ฐธ๊ฐ์๋ ํ 5๊ฐ๋ฅผ ์๋๋ค. ํ์ ์๋ ์์๋ ์ฐธ๊ฐ์๊ฐ ์์ ๋กญ๊ฒ ์ ํ ์ ์๋ค. ์ด๋ ๊ฒ ํ 5๊ฐ๋ฅผ ์์ ๋ง๋ค์ด์ง 5ร5ร5 ํฌ๊ธฐ์ ํ๋ธ๊ฐ ๋ฐ๋ก ์ฐธ๊ฐ์๋ฅผ ์ํ ๋ฏธ๋ก์ด๋ค. ์ด ๋ ํ๋ธ์ ์
๊ตฌ๋ ์ ์ก๋ฉด์ฒด์์ ์ฐธ๊ฐ์๊ฐ ์์๋ก ์ ํํ ๊ผญ์ง์ ์ ์์นํ ์นธ์ด๊ณ ์ถ๊ตฌ๋ ์
๊ตฌ์ ๋ฉด์ ๊ณต์ ํ์ง ์๋ ๊ผญ์ง์ ์ ์์นํ ์นธ์ด๋ค.
+ * ์ฐธ๊ฐ์๋ ํ์ฌ ์์นํ ์นธ์์ ๋ฉด์ผ๋ก ์ธ์ ํ ์นธ์ด ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์นธ์ธ ๊ฒฝ์ฐ ๊ทธ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค.
+ * ์ฐธ๊ฐ์ ์ค์์ ๋ณธ์ธ์ด ์ค๊ณํ ๋ฏธ๋ก๋ฅผ ๊ฐ์ฅ ์ ์ ์ด๋ ํ์๋ก ํ์ถํ ์ฌ๋์ด ์ฐ์นํ๋ค. ๋ง์ฝ ๋ฏธ๋ก์ ์
๊ตฌ ํน์ ์ถ๊ตฌ๊ฐ ๋งํ์๊ฑฐ๋, ์
๊ตฌ์์ ์ถ๊ตฌ์ ๋๋ฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ์๋ ํ์ถ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
+ * ์ด ๋ํ์์ ์ฐ์นํ๊ธฐ ์ํด์๋ ๋ฏธ๋ก๋ฅผ ์ ๋น ์ ธ๋์ฌ ์ ์๊ธฐ ์ํ ๋ด๋ ฅ ์ฆ์ง๊ณผ ์ฒด๋ ฅ ํ๋ จ, ๊ทธ๋ฆฌ๊ณ ์ ์ ํ ์ด์ด ์ ์ผ ์ค์ํ์ง๋ง, ๊ฐ์ฅ ์ ์ ์ด๋ ํ์๋ก ์ถ๊ตฌ์ ๋๋ฌํ ์ ์๊ฒ๋ ๋ฏธ๋ก๋ฅผ ๋ง๋๋ ๋ฅ๋ ฅ ๋ํ ์์ด์๋ ์ ๋๋ค. ์ฃผ์ด์ง ํ์์ ๊ฐ์ฅ ์ ์ ์ด๋ ํ์๋ก ์ถ๊ตฌ์ ๋๋ฌํ ์ ์๊ฒ๋ ๋ฏธ๋ก๋ฅผ ๋ง๋ค์์ ๋ ๋ช ๋ฒ ์ด๋์ ํด์ผํ๋์ง ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค๋ถํฐ 25์ค์ ๊ฑธ์ณ ํ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ์ 5์ค์ ๊ฑธ์ณ ์ฃผ์ด์ง๋ฉฐ ๊ฐ ์ค์๋ 5๊ฐ์ ์ซ์๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. 0์ ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์นธ, 1์ ์ฐธ๊ฐ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์นธ์ ์๋ฏธํ๋ค.
+ *
+ * 1 1 1 1 1 -> arr[0][0][0] ~ arr[0][0][4]
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0 -> arr[0][4][0] ~ arr[0][4][4]
+ * 1 1 1 1 1 -> arr[1][0][0] ~ arr[1][0][4]
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0 -> arr[1][4][0] ~ arr[1][4][4]
+ * 1 1 1 1 1 -> arr[2][0][0] ~ arr[2][0][4]
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0 -> arr[2][4][0] ~ arr[2][4][4]
+ * 1 1 1 1 1 -> arr[3][0][0] ~ arr[3][0][4]
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0 -> arr[3][4][0] ~ arr[3][4][4]
+ * 1 1 1 1 1 -> arr[4][0][0] ~ arr[4][0][4]
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0 -> arr[4][4][0] ~ arr[4][4][4]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ฃผ์ด์ง ํ์ผ๋ก ์ค๊ณ๋ ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ๊ฐ์ฅ ์ ์ ์ด๋ ํ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋จ, ์ด๋ป๊ฒ ์ค๊ณํ๋๋ผ๋ ํ์ถ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 12
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 1304ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 294MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G2_16985 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int[][][] arr = new int[5][5][5];
+
+ // * ์ด๊ธฐ ์ค์
+ static int min = Integer.MAX_VALUE; // ์ต์ ์ด๋ ๊ฑฐ๋ฆฌ
+ static int[] panel = new int[5]; // ๊ฐ ์ธต๋ง๋ค ๊ณ ๋ฅธ ํ๋ฌ ๋ฒํธ
+ static int[][][] maze; // ๊ฐ ๊ฒฝ์ฐ์ ๋ฏธ๋ก
+ static int[][][] visited; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0, 0, 0};
+ static int[] dy = {0, 0, 1, -1, 0, 0};
+ static int[] dz = {0, 0, 0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ๋ฐ๊ธฐ
+
+ // * 2. ๊ฐ ์ธต๋ง๋ค ํ๋ฌ์ ๊ณ ๋ฅด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ ๊ทธ๋๋ง๋ค ๋ชจ๋ ์ธต์ ๋ชจ๋ ํ์ ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณจ๋ผ BFS
+ selectPanel(0, 0);
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(String.valueOf(min == Integer.MAX_VALUE ? -1 : min));
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ for (int k = 0; k < 5; k++) {
+ for (int i = 0; i < 5; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < 5; j++) {
+ arr[k][i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+ }
+
+ // ! ๊ฐ ์ธต๋ง๋ค ํ์ ๊ณ ๋ฅด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ ๊ทธ๋๋ง๋ค getMaze()ํจ์๋ฅผ ์คํ
+ public static void selectPanel(int len, int flag) {
+ if (len == 5) {
+ getMaze();
+ return;
+ }
+
+ for (int i = 0; i < 5; i++) {
+ if ((flag & (1 << (i-1))) != 0) {
+ continue;
+ }
+
+ panel[len] = i;
+ selectPanel(len+1, flag | (1 << (i-1)));
+ }
+ }
+
+ // ! ๋ชจ๋ ์ธต์ ๋ชจ๋ ํ์ ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ BFS ์ํํ๋ ํจ์
+ public static void getMaze() {
+ maze = new int[5][5][5];
+ int[] degree = new int[5];
+
+ for (int k = 0; k < 1024; k++) {
+ int p = 0;
+ int num = k;
+ while (num != 0) {
+ degree[p++] = num % 4;
+ num /= 4;
+ }
+
+ for (int i = 0; i < 5; i++) {
+ maze[i] = rotate(degree[i] * 90, panel[i]);
+ }
+
+ if (maze[0][0][0] == 1) {
+ visited = new int[5][5][5];
+ visited[0][0][0] = 1;
+ bfs();
+ }
+ }
+ }
+
+ // ! 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๋(r)์ ๋ฐ๋ผ ํ์ ํ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ ํจ์
+ // ! r = 0 (0'), 90 (90'), 180 (180'), 270(270')
+ public static int[][] rotate(int r, int floor) {
+ if (r == 0) {
+ return arr[floor];
+ }
+
+ int[][] newPanel = new int[5][5];
+
+ if (r == 90) {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ newPanel[j][4-i] = arr[floor][i][j];
+ }
+ }
+ return newPanel;
+ } else if (r == 180) {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ newPanel[4-i][4-j] = arr[floor][i][j];
+ }
+ }
+ return newPanel;
+ } else if (r == 270) {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ newPanel[4-j][i] = arr[floor][i][j];
+ }
+ }
+ return newPanel;
+ }
+
+ return null;
+ }
+
+ // ! ์ผ๋ฐ์ ์ธ 3์ฐจ์ ๋ฐฐ์ด์ BFS ์ํ
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {0, 0, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == 4 && cur[1] == 4 && cur[2] == 4) {
+ if (min > visited[cur[0]][cur[1]][cur[2]]-1) {
+ min = visited[cur[0]][cur[1]][cur[2]]-1;
+ }
+ }
+
+ for (int i = 0; i < 6; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+ int nz = cur[2] + dz[i];
+
+ if (nx < 0 || ny < 0 || nz < 0 || nx >= 5 || ny >= 5 || nz >= 5) {
+ continue;
+ }
+
+ if (maze[nx][ny][nz] == 1 && visited[nx][ny][nz] == 0) {
+ visited[nx][ny][nz] = visited[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[] {nx, ny, nz});
+ }
+ }
+ }
+
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_17244.java b/java/BOJ/Gold/II/G2_17244.java
new file mode 100644
index 0000000..626e03f
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_17244.java
@@ -0,0 +1,88 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17244
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G2_17244 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m;
+ static int count;
+ static int[] start;
+ static int[] end;
+
+ static char[][] arr;
+ static int[][] key;
+ static int[][][] visit;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+ bfs();
+
+ int keyCount = count == 0 ? 0 : (2 << (count-1)) - 1;
+ System.out.println(visit[end[0]][end[1]][keyCount]);
+ }
+
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {start[0], start[1], 0});
+ visit[start[0]][start[1]][0] = 0;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ continue;
+ }
+
+ if (arr[nx][ny] == '#') {
+ continue;
+ }
+
+ if (visit[nx][ny][cur[2] | key[nx][ny]] == 0) {
+ visit[nx][ny][cur[2] | key[nx][ny]] = visit[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[] {nx, ny, cur[2] | key[nx][ny] });
+ }
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ m = Integer.parseInt(st.nextToken());
+ n = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ key = new int[n][m];
+ visit = new int[n][m][64];
+ count = 0;
+ for (int i = 0; i < n; i++) {
+ char[] line = br.readLine().toCharArray();
+ for (int j = 0; j < m; j++) {
+ if (line[j] == 'S') {
+ start = new int[] {i, j};
+ } else if (line[j] == 'E') {
+ end = new int[] {i, j};
+ } else if (line[j] == 'X') {
+ key[i][j] = (int) Math.pow(2, count++);
+ }
+
+ arr[i][j] = line[j];
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_1938.java b/java/BOJ/Gold/II/G2_1938.java
new file mode 100644
index 0000000..f83a2e3
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_1938.java
@@ -0,0 +1,196 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/1938
+ *
+ * ! ์ ๋ชฉ: ํต๋๋ฌด ์ฎ๊ธฐ๊ธฐ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์ : ๋งํฌ ์ฐธ์กฐ
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ฃผ์ด์ง ํ์ง์ ํ ๋ณ์ ๊ธธ์ด N์ด ์ฃผ์ด์ง๋ค. (4 โค N โค 50) ์ฃผ์ด์ง๋ค. ์ด์ด์ ๊ทธ ์งํ์ ์ ๋ณด๊ฐ 0, 1, B, E๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด๋ก ์ฃผ์ด์ง๋ค. ํ ์ค์ ์
๋ ฅ๋๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ N์ด๋ฉฐ ์
๋ ฅ ๋ฌธ์ ์ฌ์ด์๋ ๋น์นธ์ด ์๋ค. ํต๋๋ฌด์ ์ต์ข
์์น์ ๊ฐ์๋ 1๊ฐ์ด๋ค.
+ *
+ * 5 -> n
+ * B0011 -> arr[0][0] ~ arr[0][n-1]
+ * B0000
+ * B0000
+ * 11000
+ * EEE00 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ต์ ๋์ ํ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋์ด ๋ถ๊ฐ๋ฅํ๋ฉด 0๋ง์ ์ถ๋ ฅํ๋ค.
+ *
+ * 9
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 104ms
+ * ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.LinkedList;
+
+public class G2_1938 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // ํ์ฑ
+ static int n;
+ static char[][] arr;
+
+ // ํต๋๋ฌด ์์์์น & ํต๋๋ฌด ๋์ฐฉ์์น
+ static int[][] log = new int[3][2];
+ static int[][] end = new int[3][2];
+
+ // ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ
+ static int[][][] visited;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ findLog(); // * ํต๋๋ฌด ์์น ์ฐพ๊ธฐ
+ int result = bfs(); // * BFS ์ํ
+
+ bw.write(String.valueOf(result)); // * ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static int bfs() {
+ LinkedList queue = new LinkedList<>(); // ํ ์์ฑ
+ visited = new int[n][n][2]; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ์ด๊ธฐํ
+
+ int ver = 0; // ์์์์น๊ฐ ๊ฐ๋ก์ธ์ง ์ธ๋ก์ธ์ง
+ if (log[0][0] - log[1][0] == 0) ver = 0; // ๊ฐ๋ก
+ else ver = 1; // ์ธ๋ก
+
+ queue.add(new int[] {log[1][0], log[1][1], ver}); // ํ์ ์ฒ์์ ํต๋๋ฌด ์์น ์ฝ์
+ visited[log[1][0]][log[1][1]][ver] = 1; // ๋ฐฉ๋ฌธ ํ์
+
+ // BFS ์ํ
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ // * ํต๋๋ฌด๊ฐ ์ต์ข
์์น์ ๋์ฐฉํ๋ค๋ฉด ์ฌ์ฉํ ๋ช
๋ น ํ์๋ฅผ ๋ฆฌํด
+ if (endCheck(cur[0], cur[1], cur[2])) {
+ return visited[cur[0]][cur[1]][cur[2]] - 1;
+ }
+
+ // * ์ํ์ข์ฐ๋ก ์ด๋ ํ ์ ์๋์ง ์ฒดํฌํ๊ณ ์ด๋์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ฐฉ๋ฌธ๋ฆฌ์คํธ์ ํ์ํ๊ณ ํ์ ์ฝ์
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (valueCheck(nx, ny, cur[2])) {
+ visited[nx][ny][cur[2]] = visited[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[] {nx, ny, cur[2]});
+ }
+
+ }
+
+ // * ํ์ ์ด ๊ฐ๋ฅํ์ง ์ฒดํฌํ๊ณ ํ์ ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ฐฉ๋ฌธ๋ฆฌ์คํธ์ ํ์ํ๊ณ ํ์ ์ฝ์
+ int newVer = cur[2] == 1 ? 0 : 1; // * ์ธ๋ก -> ๊ฐ๋ก, ๊ฐ๋ก -> ์ธ๋ก
+
+ // * ํ์ ํ ๋ ๋ฒ์๊ฐ ๋ฒ์ด๋๋์ง(valueCheck) + ํ์ ํ ๋ ๋ฒ์ฑ๋์ง ์์ ๋๋ฌด๊ฐ ์๋์ง(turnCheck)
+ if (valueCheck(cur[0], cur[1], newVer) && turnCheck(cur[0], cur[1])) {
+ visited[cur[0]][cur[1]][newVer] = visited[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[] {cur[0], cur[1], newVer});
+ }
+
+ }
+ return 0; // * ์ต์ข
์์น๊น์ง ๋๋ฌํ ์ ์๋ค๋ฉด 0์ ๋ฆฌํด
+ }
+
+ // ! ์ค์ฌ์ ๊ธฐ์ค์ผ๋ก 3x3 ๊ตฌ์ญ์ ๋ฒ์ฑ๋์ง ์์ ๋๋ฌด(๊ฐ์ด 1์ธ)๊ฐ ์๋์ง
+ public static boolean turnCheck(int x, int y) {
+ for (int i = -1; i <= 1; i++) {
+ for (int j = -1; j <= 1; j++) {
+ if (arr[x + i][y + j] == '1') {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ // ! ์ด๋ํ ๋ ๊ฐ๋ก ํน์ ์ธ๋ก์ ๋ฐ๋ผ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ฒ์ฑ๋์ง ์์ ๋๋ฌด๊ฐ ์๋์ง + ์ด๋ฏธ ํด๋น ์์น๋ฅผ ๋ ์ ์ ํ์์ ๋ช
๋ น์ผ๋ก ๋ฐฉ๋ฌธํ๋์ง ํ๋จํ๋ ํจ์
+ public static boolean valueCheck(int x, int y, int ver) {
+ if (ver == 1) { // * ์ธ๋ก์ผ ๋
+ // ์: x-1, y
+ if (x-1 < 0 || x-1 >= n || y < 0 || y >= n || arr[x-1][y] == '1') {
+ return false;
+ }
+ // ์ค๊ฐ: x, y
+ if (x < 0 || x >= n || y < 0 || y >= n || arr[x][y] == '1') {
+ return false;
+ }
+ // ์๋: x+1, y
+ if (x+1 < 0 || x+1 >= n || y < 0 || y >= n || arr[x+1][y] == '1') {
+ return false;
+ }
+ } else if (ver == 0) { // * ๊ฐ๋ก์ผ ๋
+ // ์ผ์ชฝ: x, y-1
+ if (x < 0 || x >= n || y-1 < 0 || y-1 >= n || arr[x][y-1] == '1') {
+ return false;
+ }
+ // ์ค๊ฐ: x, y
+ if (x < 0 || x >= n || y < 0 || y >= n || arr[x][y] == '1') {
+ return false;
+ }
+ // ์ค๋ฅธ์ชฝ: x, y+1
+ if (x < 0 || x >= n || y+1 < 0 || y+1 >= n || arr[x][y+1] == '1') {
+ return false;
+ }
+ }
+
+ // * ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ํ์ธ
+ if (visited[x][y][ver] > 0) return false;
+ return true;
+ }
+
+ // ! ํต๋๋ฌด๊ฐ ์ต์ข
์์น์ ๋์ฐฉํ๋์ง๋ฅผ ํ๋จํ๋ ํจ์
+ public static boolean endCheck(int x, int y, int ver) {
+ if (end[0][0] - end[1][0] == 0) { // ๊ฐ๋ก
+ return x == end[1][0] && y == end[1][1] && ver == 0;
+ } else {
+ return x == end[1][0] && y == end[1][1] && ver == 1;
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new char[n][n];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+
+ // ! ํต๋๋ฌด์ ์์ ์์น์ ์ต์ข
์์น๋ฅผ ์ฐพ๋ ํจ์
+ public static void findLog() {
+ int p = 0;
+ int c = 0;
+
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (arr[i][j] == 'B') {
+ log[p++] = new int[] {i, j};
+ } else if (arr[i][j] == 'E') {
+ end[c++] = new int[] {i, j};
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/II/G2_21609.java b/java/BOJ/Gold/II/G2_21609.java
new file mode 100644
index 0000000..5dd0b58
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_21609.java
@@ -0,0 +1,322 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/21609
+ *
+ * ? ์ ๋ชฉ: ์์ด ์คํ๊ต
+ * ? ๋ฌธ์
+ * ์์ด ์คํ๊ต์ ์ฝ๋ฉ ๋์๋ฆฌ์์ ๊ฒ์์ ๋ง๋ค์๋ค. ์ด ๊ฒ์์ ํฌ๊ธฐ๊ฐ NรN์ธ ๊ฒฉ์์์ ์งํ๋๊ณ , ์ด๊ธฐ์ ๊ฒฉ์์ ๋ชจ๋ ์นธ์๋ ๋ธ๋ก์ด ํ๋์ฉ ๋ค์ด์๊ณ , ๋ธ๋ก์ ๊ฒ์์ ๋ธ๋ก, ๋ฌด์ง๊ฐ ๋ธ๋ก, ์ผ๋ฐ ๋ธ๋ก์ด ์๋ค. ์ผ๋ฐ ๋ธ๋ก์ M๊ฐ์ง ์์์ด ์๊ณ , ์์ M์ดํ์ ์์ฐ์๋ก ํํํ๋ค. ๊ฒ์์ ๋ธ๋ก์ -1, ๋ฌด์ง๊ฐ ๋ธ๋ก์ 0์ผ๋ก ํํํ๋ค. (i, j)๋ ๊ฒฉ์์ i๋ฒ ํ, j๋ฒ ์ด์ ์๋ฏธํ๊ณ , |r1 - r2| + |c1 - c2| = 1์ ๋ง์กฑํ๋ ๋ ์นธ (r1, c1)๊ณผ (r2, c2)๋ฅผ ์ธ์ ํ ์นธ์ด๋ผ๊ณ ํ๋ค.
+ * ๋ธ๋ก ๊ทธ๋ฃน์ ์ฐ๊ฒฐ๋ ๋ธ๋ก์ ์งํฉ์ด๋ค. ๊ทธ๋ฃน์๋ ์ผ๋ฐ ๋ธ๋ก์ด ์ ์ด๋ ํ๋ ์์ด์ผ ํ๋ฉฐ, ์ผ๋ฐ ๋ธ๋ก์ ์์ ๋ชจ๋ ๊ฐ์์ผ ํ๋ค. ๊ฒ์์ ๋ธ๋ก์ ํฌํจ๋๋ฉด ์ ๋๊ณ , ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์ผ๋ง๋ ๋ค์ด์๋ ์๊ด์๋ค. ๊ทธ๋ฃน์ ์ํ ๋ธ๋ก์ ๊ฐ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ผ ํ๋ฉฐ, ์์์ ํ ๋ธ๋ก์์ ๊ทธ๋ฃน์ ์ํ ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํด์ ๊ทธ๋ฃน์ ์ํ ๋ค๋ฅธ ๋ชจ๋ ์นธ์ผ๋ก ์ด๋ํ ์ ์์ด์ผ ํ๋ค. ๋ธ๋ก ๊ทธ๋ฃน์ ๊ธฐ์ค ๋ธ๋ก์ ๋ฌด์ง๊ฐ ๋ธ๋ก์ด ์๋ ๋ธ๋ก ์ค์์ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๋ธ๋ก, ๊ทธ๋ฌํ ๋ธ๋ก์ด ์ฌ๋ฌ๊ฐ๋ฉด ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๋ธ๋ก์ด๋ค.
+ * ์ค๋์ ์ด ๊ฒ์์ ์คํ ํ๋ ์ด ๊ธฐ๋ฅ์ ๋ง๋๋ ค๊ณ ํ๋ค. ์คํ ํ๋ ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ๋ธ๋ก ๊ทธ๋ฃน์ด ์กด์ฌํ๋ ๋์ ๊ณ์ํด์ ๋ฐ๋ณต๋์ด์ผ ํ๋ค.
+ * ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน์ ์ฐพ๋๋ค. ๊ทธ๋ฌํ ๋ธ๋ก ๊ทธ๋ฃน์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ํฌํจ๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์๊ฐ ๊ฐ์ฅ ๋ง์ ๋ธ๋ก ๊ทธ๋ฃน, ๊ทธ๋ฌํ ๋ธ๋ก๋ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๊ธฐ์ค ๋ธ๋ก์ ํ์ด ๊ฐ์ฅ ํฐ ๊ฒ์, ๊ทธ ๊ฒ๋ ์ฌ๋ฌ๊ฐ์ด๋ฉด ์ด์ด ๊ฐ์ฅ ํฐ ๊ฒ์ ์ฐพ๋๋ค.
+ * 1์์ ์ฐพ์ ๋ธ๋ก ๊ทธ๋ฃน์ ๋ชจ๋ ๋ธ๋ก์ ์ ๊ฑฐํ๋ค. ๋ธ๋ก ๊ทธ๋ฃน์ ํฌํจ๋ ๋ธ๋ก์ ์๋ฅผ B๋ผ๊ณ ํ์ ๋, B2์ ์ ํ๋ํ๋ค.
+ * ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ค.
+ * ๊ฒฉ์๊ฐ 90๋ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ค.
+ * ๋ค์ ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ค.
+ * ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ฉด ๊ฒ์์ ๋ธ๋ก์ ์ ์ธํ ๋ชจ๋ ๋ธ๋ก์ด ํ์ ๋ฒํธ๊ฐ ํฐ ์นธ์ผ๋ก ์ด๋ํ๋ค. ์ด๋์ ๋ค๋ฅธ ๋ธ๋ก์ด๋ ๊ฒฉ์์ ๊ฒฝ๊ณ๋ฅผ ๋ง๋๊ธฐ ์ ๊น์ง ๊ณ์ ๋๋ค.
+ *
+ * ๋ค์์ N = 5, M = 3์ธ ๊ฒฝ์ฐ์ ์์์ด๋ค.
+ *
+ * 2 2 -1 3 1
+ * 3 3 2 0 -1
+ * 0 0 0 1 2
+ * -1 3 1 3 2
+ * 0 3 2 2 1
+ * ์ฌ๊ธฐ์ ์ฐพ์ ์ ์๋ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน์ ๋ค์๊ณผ ๊ฐ์ด ๋นจ๊ฐ์์ผ๋ก ํ์ํ๋ค.
+ *
+ * 2 2 -1 3 1
+ * 3 3 2 0 -1
+ * 0 0 0 1 2
+ * -1 3 1 3 2
+ * 0 3 2 2 1
+ * ๋ธ๋ก ๊ทธ๋ฃน์ด ์ ๊ฑฐ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๊ณ , ์ ์ 82์ ์ ํ๋ํ๋ค.
+ *
+ * 2 2 -1 3 1
+ * 2 0 -1
+ * 1 2
+ * -1 1 3 2
+ * 2 2 1
+ * ์ค๋ ฅ์ด ์์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ค.
+ *
+ * -1 3 1
+ * 0 -1
+ * 2 2 1 2
+ * -1 1 3 2
+ * 2 2 2 1
+ * 90๋ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+ *
+ * 1 -1 2 2 1
+ * 3 0 1 3 2
+ * -1 2 1 2
+ * 2
+ * 2 -1
+ * ๋ค์ ์ฌ๊ธฐ์ ์ค๋ ฅ์ด ์์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ค.
+ *
+ * 1 -1
+ * 3 2 2 1
+ * -1 1 3 2
+ * 2 1 2
+ * 0 2 -1 2
+ * ์คํ ํ๋ ์ด๊ฐ ๋ชจ๋ ๋๋ฌ์ ๋ ํ๋ํ ์ ์์ ํฉ์ ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๊ฒฉ์ ํ ๋ณ์ ํฌ๊ธฐ N, ์์์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฒฉ์์ ์นธ์ ๋ค์ด์๋ ๋ธ๋ก์ ์ ๋ณด๊ฐ 1๋ฒ ํ๋ถํฐ N๋ฒ ํ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ํ์ ๋ํ ์ ๋ณด๋ 1์ด๋ถํฐ N์ด๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์นธ์ ์ ๋ณด๋ -1, 0, M์ดํ์ ์์ฐ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
+ *
+ * 5 3 -> n m
+ * 2 2 -1 3 1 -> arr[0][0] ~ arr[n-1]
+ * 3 3 2 0 -1
+ * 0 0 0 1 2
+ * -1 3 1 3 2
+ * 0 3 2 2 1 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํ๋ํ ์ ์์ ํฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 77
+ *
+ * ? ์ ํ
+ * 1 โค N โค 20
+ * 1 โค M โค 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 272ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 20MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ **/
+package Gold.II;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class G2_21609 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int point = 0; // ์ต์ข
์ ์
+ static boolean isFinished = false; // ๋๋ฌ๋์ง ์ฌ๋ถ
+ static boolean[][] visited; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ
+ static ArrayList> groups; // ๋งค ๋จ๊ณ๋ง๋ค ๊ฐ๋ฅํ ๋ชจ๋ ๋ธ๋ก ๊ทธ๋ฃน ๋ฆฌ์คํธ
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. 2๊ฐ ์ด์์ ๋ธ๋ก์ ๊ฐ๋ ๊ทธ๋ฃน์ด ์์ ๋๊น์ง
+ while (true) {
+ groups = new ArrayList<>(); // ๊ทธ๋ฃน ๋ฆฌ์คํธ ์ด๊ธฐํ
+ visited = new boolean[n][n]; // ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ ์ด๊ธฐํ
+
+ // * 2-1. ๊ทธ๋ฃน ์ฐพ๊ธฐ
+ findGroup();
+
+ // ์กด์ฌํ๋ ๊ทธ๋ฃน์ด ์๋ค๋ฉด ์ข
๋ฃ
+ if (isFinished) {
+ break;
+ }
+
+ // * 2-2. ๋ฌธ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต๋ ๊ธธ์ด์ ๋ธ๋ก ์ฐพ๊ธฐ
+ ArrayList maxBlock = findMaxBlock();
+
+ // ๋ฌธ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ธ๋ก์ ์ต๋ ๊ธธ์ด๊ฐ 2๋ณด๋ค ์์ ๋ ์ข
๋ฃ
+ if (maxBlock.size() < 2) {
+ break;
+ }
+
+ // * 2-3. ํด๋น ๋ธ๋ก์ ๊ธธ์ด์ ์ ๊ณฑ๋งํผ ์ ์ ์ฆ๊ฐ
+ point += (int) Math.pow(maxBlock.size(), 2);
+
+ // * 2-4. ํด๋น ๊ทธ๋ฃน์ ๋ธ๋ก๋ค์ ๋น์นธ(-2) ์ฒ๋ฆฌ
+ for (int[] a: maxBlock) {
+ arr[a[0]][a[1]] = -2;
+ }
+
+ // * 2-5. ์ค๋ ฅ -> ๋ฐ์๊ณ ํ์ -> ์ค๋ ฅ
+ down();
+ rotateRCW();
+ down();
+ }
+
+ // * 3. ์ ์ ์ถ๋ ฅ
+ bw.write(String.valueOf(point));
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ๊ธฐ์กด ๋ธ๋ก ์ฐพ๊ธฐ ํจ์
+ public static int[] findBase(ArrayList list) {
+ for (int[] b : list) {
+ if (arr[b[0]][b[1]] != 0) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ // ! 2์ฐจ์ ๋ฐฐ์ด ๋ฐ์๊ณ ํ์ ํจ์
+ public static void rotateRCW() {
+ // X, Y -> N-Y-1, X
+ int[][] newArr = new int[n][n];
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ newArr[n-j-1][i] = arr[i][j];
+ }
+ }
+
+ arr = newArr;
+ }
+
+ // ! ์ค๋ ฅ ์์ฉ ํจ์
+ public static void down() {
+ for (int j = 0; j < n; j++) {
+ for (int i = n-1; i >= 0; i--) {
+ if (arr[i][j] >= 0) {
+ for (int k = i+1; k < n; k++) {
+ if (arr[k][j] == -2) {
+ arr[k][j] = arr[k-1][j];
+ arr[k-1][j] = -2;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // ! ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ธธ์ด๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน ๋ฆฌ์คํธ๋ฅผ ์ฐพ๋ ํจ์
+ public static ArrayList findMaxBlock() {
+ int maxLength = 0;
+ for (int i = 0; i < groups.size(); i++) {
+ if (maxLength < groups.get(i).size()) {
+ maxLength = groups.get(i).size();
+ }
+ }
+
+ ArrayList maxBlock = null;
+ int rainbow = 0;
+ int baseX = 0;
+ int baseY = 0;
+
+ for (int i = 0; i < groups.size(); i++) {
+ if (groups.get(i).size() == maxLength) {
+ blockSort(groups.get(i));
+ int[] base = findBase(groups.get(i));
+
+ int count = 0;
+ for (int[] g: groups.get(i)) {
+ if (arr[g[0]][g[1]] == 0) {
+ count++;
+ }
+ }
+
+ if (maxBlock == null) {
+ maxBlock = groups.get(i);
+ baseX = base[0];
+ baseY = base[1];
+ rainbow = count;
+ continue;
+ }
+
+ if (rainbow < count) {
+ maxBlock = groups.get(i);
+ rainbow = count;
+ baseX = base[0];
+ baseY = base[1];
+ } else if (rainbow == count) {
+ if (baseX < base[0]) {
+ maxBlock = groups.get(i);
+ rainbow = count;
+ baseX = base[0];
+ baseY = base[1];
+ } else if (baseX == base[0]) {
+ if (baseY < base[1]) {
+ maxBlock = groups.get(i);
+ rainbow = count;
+ baseX = base[0];
+ baseY = base[1];
+ }
+ }
+ }
+ }
+ }
+
+ return maxBlock;
+ }
+
+ // ! ๊ฐ ๊ทธ๋ฃน์ ๋ธ๋ก์ ์์น๋ฅผ ํ, ์ด์ ๋ํด ์ค๋ฆ์ฐจ์
+ public static void blockSort(ArrayList list) {
+ list.sort((a, b) -> {
+ if (a[0] == b[0]) {
+ return a[1] - b[1];
+ }
+ return a[0] - b[0];
+ });
+ }
+
+ // ! DFS๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๋ธ๋ก ๊ทธ๋ฃน ๋ฆฌ์คํธ๋ฅผ ์ฐพ๋ ํจ์
+ public static void findGroup() {
+ isFinished = true;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (arr[i][j] > 0 && !visited[i][j]) {
+ isFinished = false;
+ groups.add(new ArrayList<>());
+ visited[i][j] = true;
+ dfs(i, j, arr[i][j]);
+
+ for (int[] group: groups.get(groups.size()-1)) {
+ if (arr[group[0]][group[1]] == 0) {
+ visited[group[0]][group[1]] = false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // ! DFS ํจ์
+ public static void dfs(int x, int y, int gNum) {
+ groups.get(groups.size()-1).add(new int[] {x, y});
+
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (0 <= nx && nx < n && 0 <= ny && ny < n && !visited[nx][ny] && (arr[nx][ny] == gNum || arr[nx][ny] == 0)) {
+ visited[nx][ny] = true;
+ dfs(nx, ny, gNum);
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_2169.java b/java/BOJ/Gold/II/G2_2169.java
new file mode 100644
index 0000000..ccb0e15
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_2169.java
@@ -0,0 +1,109 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2169
+ *
+ * ? ์ ๋ชฉ: ๋ก๋ด ์กฐ์ข
ํ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * NASA์์๋ ํ์ฑ ํ์ฌ๋ฅผ ์ํด ํ์ฑ์ ๋ฌด์ ์กฐ์ข
๋ก๋ด์ ๋ณด๋๋ค. ์ค์ ํ์ฑ์ ๋ชจ์ต์ ๊ต์ฅํ ๋ณต์กํ์ง๋ง, ๋ก๋ด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ผ๋ง ์ ๋๊ธฐ ๋๋ฌธ์ ์งํ์ NรM ๋ฐฐ์ด๋ก ๋จ์ํ ํ์ฌ ์๊ฐํ๊ธฐ๋ก ํ๋ค.
+ * ์งํ์ ๊ณ ์ ์ฐจ์ ํน์ฑ์, ๋ก๋ด์ ์์ง์ผ ๋ ๋ฐฐ์ด์์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์๋์ชฝ์ผ๋ก ์ด๋ํ ์ ์์ง๋ง, ์์ชฝ์ผ๋ก๋ ์ด๋ํ ์ ์๋ค. ๋ํ ํ ๋ฒ ํ์ฌํ ์ง์ญ(๋ฐฐ์ด์์ ํ๋์ ์นธ)์ ํ์ฌํ์ง ์๊ธฐ๋ก ํ๋ค.
+ * ๊ฐ๊ฐ์ ์ง์ญ์ ํ์ฌ ๊ฐ์น๊ฐ ์๋๋ฐ, ๋ก๋ด์ ๋ฐฐ์ด์ ์ผ์ชฝ ์ (1, 1)์์ ์ถ๋ฐ์์ผ ์ค๋ฅธ์ชฝ ์๋ (N, M)์ผ๋ก ๋ณด๋ด๋ ค๊ณ ํ๋ค. ์ด๋, ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์, ํ์ฌํ ์ง์ญ๋ค์ ๊ฐ์น์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N, M(1โคN, Mโค1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ๊ฐ ์๋ ์ ๋๊ฐ์ด 100์ ๋์ง ์๋ ์ ์์ด๋ค. ์ด ๊ฐ์ ๊ทธ ์ง์ญ์ ๊ฐ์น๋ฅผ ๋ํ๋ธ๋ค.
+ *
+ * 5 5 -> n m
+ * 10 25 7 8 13 -> arr[1][1] ~ arr[1][m]
+ * 68 24 -78 63 32
+ * 12 -69 100 -29 -25
+ * -16 -22 -57 -33 99
+ * 7 -76 -11 77 15 -> arr[n][1] ~ arr[n][m]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ต๋ ๊ฐ์น์ ํฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 319
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.628์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 116MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G2_2169 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m;
+ static int[][] arr;
+
+ static int MIN = -100_000_000;
+ static boolean[][] visit;
+ static int[][][] dp;
+
+ // 0 : ์๋, 1: ์ค๋ฅธ์ชฝ, 2: ์ผ์ชฝ
+ static int[] dx = {1, 0, 0};
+ static int[] dy = {0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ System.out.println(
+ Math.max(
+ findMax(1, 1, 0),
+ findMax(1, 1, 1))
+ );
+ }
+
+ public static int findMax(int x, int y, int dir) {
+ if (x == n && y == m) {
+ return arr[n][m];
+ }
+
+ if (dp[x][y][dir] != 0) {
+ return dp[x][y][dir];
+ }
+
+ visit[x][y] = true;
+ int max = MIN;
+
+ // 0 : ์๋, 1: ์ค๋ฅธ์ชฝ, 2: ์ผ์ชฝ
+ for (int i = 0; i < 3; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (1 <= nx && 1 <= ny && nx <= n && ny <= m && !visit[nx][ny]) {
+ max = Math.max(max, findMax(nx, ny, i) + arr[x][y]);
+ }
+ }
+
+ visit[x][y] = false;
+ return dp[x][y][dir] = max;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n + 1][m + 1];
+ visit = new boolean[n + 1][m + 1];
+ dp = new int[n + 1][m + 1][3];
+
+ for (int i = 1; i <= n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 1; j <= m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_2211.java b/java/BOJ/Gold/II/G2_2211.java
new file mode 100644
index 0000000..e005e46
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_2211.java
@@ -0,0 +1,133 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/2211
+ *
+ * ! ์ ๋ชฉ: ๋คํธ์ํฌ ๋ณต๊ตฌ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 192MB
+ *
+ * ! ๋ฌธ์
+ * N(1 โค N โค 1,000)๊ฐ์ ์ปดํจํฐ๋ก ๊ตฌ์ฑ๋ ๋คํธ์ํฌ๊ฐ ์๋ค. ์ด๋ค ์ค ๋ช ๊ฐ์ ์ปดํจํฐ๋ค์ ์๋ก ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋์ด ์์ด ์๋ก ๋ค๋ฅธ ๋ ์ปดํจํฐ ๊ฐ ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ๋์ด ์๋ค. ํต์ ์ ํ ๋์๋ ์๋ก ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ํ์ ์ ์ด์ฉํ ์๋ ์์ผ๋ฉฐ, ํ์ ๊ณผ ๋ค๋ฅธ ์ปดํจํฐ๋ฅผ ๊ฑฐ์ณ์ ํต์ ์ ํ ์๋ ์๋ค.
+ * ๊ฐ ์ปดํจํฐ๋ค๊ณผ ํ์ ์ ๊ทธ ์ฑ๋ฅ์ด ์ฐจ์ด๊ฐ ๋ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ๊ฐ์ ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ํ์ ์ ์ด์ฉํด์ ํต์ ์ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์๋ก ๋ค๋ฅผ ์ ์๋ค. ์ฌ์ง์ด๋ ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ํ์ ์ด ์คํ๋ ค ๋ ๋๋ ค์, ๋ค๋ฅธ ์ปดํจํฐ๋ฅผ ํตํด์ ํต์ ์ ํ๋ ๊ฒ์ด ๋ ์ ๋ฆฌํ ์๋ ์๋ค. ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ํ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๊ทธ ํ์ ์ ์ด์ฉํด์ ํต์ ์ ํ๋ ๋ฐ ๋๋ ์๊ฐ๋งํผ์ด ๋ค๊ฒ ๋๋ค. ์ฌ๋ฌ ๊ฐ์ ํ์ ์ ๊ฑฐ์น๋ ๊ฒฝ์ฐ์๋ ๊ฐ ํ์ ์ ์ด์ฉํด์ ํต์ ์ ํ๋ ๋ฐ ๋๋ ์๊ฐ์ ํฉ๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
+ * ์ด๋ ๋ , ํด์ปค๊ฐ ๋คํธ์ํฌ์ ์นจ์
ํ์๋ค. ๋คํธ์ํฌ์ ๊ด๋ฆฌ์๋ ์ฐ์ ๋ชจ๋ ํ์ ๊ณผ ์ปดํจํฐ๋ฅผ ์ฐจ๋จํ ํ, ํด์ปค์ ๊ณต๊ฒฉ์ ๋ง์ ์ ์์๋ค. ๊ด๋ฆฌ์๋ ์ปดํจํฐ์ ๋ณด์ ์์คํ
์ ์ค์นํ๋ ค ํ์๋๋ฐ, ๋ฒ์ ๋ฌธ์ ๋ก ๋ณด์ ์์คํ
์ ํ ๋์ ์ํผ์ปดํจํฐ์๋ง ์ค์นํ ์ ์์๋ค. ํ ์ปดํจํฐ๊ฐ ๊ณต๊ฒฉ์ ๋ฐ๊ฒ ๋๋ฉด, ๋คํธ์ํฌ๋ฅผ ํตํด ์ํผ์ปดํจํฐ์ ์ด ์ฌ์ค์ด ์ ๋ฌ์ด ๋๊ณ , ๊ทธ๋ฌ๋ฉด ์ํผ์ปดํจํฐ์์๋ ๋คํธ์ํฌ๋ฅผ ์ด์ฉํด์ ๋ณด์ ํจํท์ ์ ์กํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค. ์ค๋น๋ฅผ ๋ง์น ๋ค, ๊ด๋ฆฌ์๋ ๋ค์ ๋คํธ์ํฌ๋ฅผ ๋ณต๊ตฌํ๊ธฐ๋ก ํ์๋ค. ์ด๋, ๋ค์์ ์กฐ๊ฑด๋ค์ด ๋ง์กฑ๋์ด์ผ ํ๋ค.
+ * ํด์ปค๊ฐ ๋ค์ ๊ณต๊ฒฉ์ ํ ์ฐ๋ ค๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ต์ ๊ฐ์์ ํ์ ๋ง์ ๋ณต๊ตฌํด์ผ ํ๋ค. ๋ฌผ๋ก , ๊ทธ๋ ๋ค๋ฉด ์๋ฌด ํ์ ๋ ๋ณต๊ตฌํ์ง ์์ผ๋ฉด ๋๊ฒ ์ง๋ง, ์ด๋ด ๊ฒฝ์ฐ ๋คํธ์ํฌ์ ์ฌ์ฉ์ ์ง์ฅ์ด ์๊ธฐ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋คํธ์ํฌ๋ฅผ ๋ณต๊ตฌํ ํ์ ์๋ก ๋ค๋ฅธ ๋ ์ปดํจํฐ ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ๋ณต๊ตฌํด์ผ ํ๋ค.
+ * ๋คํธ์ํฌ๋ฅผ ๋ณต๊ตฌํด์ ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ํด์ปค์๊ฒ ๊ณต๊ฒฉ์ ๋ฐ์์ ๋ ๋ณด์ ํจํท์ ์ ์กํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๋ ์ค์ํ ๋ฌธ์ ๊ฐ ๋๋ค. ๋ฐ๋ผ์ ์ํผ์ปดํจํฐ๊ฐ ๋ค๋ฅธ ์ปดํจํฐ๋ค๊ณผ ํต์ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ด, ์๋์ ๋คํธ์ํฌ์์ ํต์ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ๋ณด๋ค ์ปค์ ธ์๋ ์ ๋๋ค.
+ * ์๋์ ๋คํธ์ํฌ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ๋คํธ์ํฌ๋ฅผ ๋ณต๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ ์ ์ N, M์ด ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ํ์ ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ์ปดํจํฐ์ B๋ฒ ์ปดํจํฐ๊ฐ ํต์ ์๊ฐ์ด C (1 โค C โค 10)์ธ ํ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์๋ฏธ์ด๋ค. ์ปดํจํฐ๋ค์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง์ ์ ์์ด๋ฉฐ, 1๋ฒ ์ปดํจํฐ๋ ๋ณด์ ์์คํ
์ ์ค์นํ ์ํผ์ปดํจํฐ์ด๋ค. ๋ชจ๋ ํต์ ์ ์์ ์๋ฐฉํฅ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ํ ํ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ์ปดํจํฐ๋ ์ด๋ ๋ฐฉํฅ์ผ๋ก๋ ํต์ ํ ์ ์๋ค.
+ *
+ * 4 5 -> n m
+ * 1 2 1 -> a b c
+ * 1 4 4 -> a b c
+ * 1 3 2 -> a b c
+ * 4 2 2 -> a b c
+ * 4 3 3 -> a b c
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ณต๊ตฌํ ํ์ ์ ๊ฐ์ K๋ฅผ ์ถ๋ ฅํ๋ค. ๋ค์ K๊ฐ์ ์ค์๋ ๋ณต๊ตฌํ ํ์ ์ ๋ํ๋ด๋ ๋ ์ ์ A, B๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ A๋ฒ ์ปดํจํฐ์ B๋ฒ ์ปดํจํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ํ์ ์ ๋ณต๊ตฌํ๋ค๋ ์๋ฏธ์ด๋ค. ์ถ๋ ฅ์ ์์์ ์์๋๋ก ํ๋ฉฐ, ๋ต์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ ์๋ฌด ๊ฒ์ด๋ ํ๋๋ง ์ถ๋ ฅํ๋ฉด ๋๋ค.
+ *
+ * 3
+ * 1 2
+ * 3 1
+ * 4 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 792ms
+ * ๋ฉ๋ชจ๋ฆฌ: 111MB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.*;
+
+public class G2_2211 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static HashMap> map;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] restored;
+ static int[] before;
+
+ // ! ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ restored[1] = 0; // * ์ํผ์ปดํจํฐ ์์น(1)
+ dijkstra(); // * ๋ค์ต์คํธ๋ผ
+
+ int count = 0; // * ๋ณต๊ตฌํ ๋คํธ์ํฌ ๊ฐฏ์
+ StringBuffer sb = new StringBuffer(); // * ๋ณต๊ตฌํ ๋คํธ์ํฌ ๋ฌธ์์ด
+
+ // * 2๋ถํฐ N๋ฒ ์ปดํจํฐ๊น์ง ๋ณต๊ตฌํ ํต์ ํ์ ์ sb์ ์ถ๊ฐ
+ for (int i = 2; i <= n; i++) {
+ if (before[i] > 0) {
+ count++;
+ sb.append(i + " " + before[i] + "\n");
+ }
+ }
+
+ // * ์ถ๋ ฅ
+ bw.write(String.valueOf(count) + "\n");
+ bw.write(sb.toString());
+
+ // * ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
+ public static void dijkstra() {
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
+ pq.add(new int[] {1, 0});
+ while (!pq.isEmpty()) {
+ int[] cur = pq.poll();
+
+ if (cur[1] > restored[cur[0]]) continue;
+
+ if (map.containsKey(cur[0])) {
+ for (int[] next: map.get(cur[0])) {
+
+ if (restored[next[0]] == -1 || restored[next[0]] > cur[1] + next[1]) {
+ pq.add(new int[] {next[0], cur[1] + next[1]});
+ restored[next[0]] = cur[1] + next[1];
+ before[next[0]] = cur[0];
+ }
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ map = new HashMap<>(); // * ์ธ์ ๋ฆฌ์คํธ
+ restored = new int[n+1]; // * ์ต๋จ ์๊ฐ ๊ฒฝ๋ก
+ before = new int[n+1]; // * ๋ณต๊ตฌ๋ ํ์ ์ ํตํด ์ฐ๊ฒฐ๋ ์ปดํจํฐ ๋ฒํธ
+
+ Arrays.fill(restored, -1); // * ์ด๊ธฐํ
+
+ // * ์ธ์ ์ปดํจํฐ ๋ฆฌ์คํธ ํด์ฌ๋งต
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ if (!map.containsKey(a)) map.put(a, new ArrayList<>());
+ if (!map.containsKey(b)) map.put(b, new ArrayList<>());
+
+ map.get(a).add(new int[] {b, c});
+ map.get(b).add(new int[] {a, c});
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/II/G2_2610.java b/java/BOJ/Gold/II/G2_2610.java
new file mode 100644
index 0000000..7777640
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_2610.java
@@ -0,0 +1,210 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2610
+ *
+ * ? ์ ๋ชฉ: ํ์ ์ค๋น
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * KOI ์ค๋น๋ฅผ ์ํด ํ์๋ฅผ ๊ฐ์ตํ๋ ค ํ๋ค. ์ฃผ์ต์ธก์์๋ ํ์์ ์ฐธ์ํ๋ ์ฌ๋์ ์์ ์ฐธ์์๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ฐ์ ธ ํ๋ ์ด์์ ์์ํ๋ฅผ ๊ตฌ์ฑํ๋ ค๊ณ ํ๋ค. ์์ํ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
+ * ์๋ก ์๊ณ ์๋ ์ฌ๋์ ๋ฐ๋์ ๊ฐ์ ์์ํ์ ์ํด์ผ ํ๋ค.
+ * ํจ์จ์ ์ธ ํ์ ์งํ์ ์ํด ์์ํ์ ์๋ ์ต๋๊ฐ ๋์ด์ผ ํ๋ค.
+ * ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ํ๋ฅผ ๊ตฌ์ฑํ ํ์ ๊ฐ ์์ํ์ ๋ํ๋ฅผ ํ ๋ช
์ฉ ๋ฝ์์ผ ํ๋ค. ๊ฐ ์์ํ์ ๋ํ๋ง์ด ํ์ ์๊ฐ ์ค ๋ฐ์ธ๊ถ์ ๊ฐ์ง๋ฉฐ, ๋ฐ๋ผ์ ํ์ ์ฐธ์์๋ค์ด ์์ ์ ์๊ฒฌ์ ๋งํ๊ธฐ ์ํด์๋ ์์ ์ด ์ํ ์์ํ์ ๋ํ์๊ฒ ์์ ์ ์๊ฒฌ์ ์ ๋ฌํด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ ์ฐธ์์๋ ์์ ์ด ์๊ณ ์๋ ์ฌ๋์๊ฒ๋ง ์๊ฒฌ์ ์ ๋ฌํ ์ ์์ด ๋ํ์๊ฒ ์๊ฒฌ์ ์ ๋ฌํ๊ธฐ ์ํด์๋ ๋๋ก ์ฌ๋ฌ ์ฌ๋์ ๊ฑฐ์ณ์ผ ํ๋ค. ๋ํ์๊ฒ ์๊ฒฌ์ ์ ๋ฌํ๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ ์ ์ฌ๋์ ๊ฑฐ์น๋ ๊ฒฝ๋ก๋ก ์๊ฒฌ์ ์ ๋ฌํ๋ฉฐ ์ด๋ ๊ฑฐ์น๋ ์ฌ๋์ ์๋ฅผ ์ฐธ์์์ ์์ฌ์ ๋ฌ์๊ฐ์ด๋ผ๊ณ ํ๋ค.
+ * ์์ํ์์ ๋ชจ๋ ์ฐธ์์๋ค์ ์์ฌ์ ๋ฌ์๊ฐ ์ค ์ต๋๊ฐ์ด ์ต์๊ฐ ๋๋๋ก ๋ํ๋ฅผ ์ ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์๋ฅผ ๋ค์ด 1๋ฒ, 2๋ฒ, 3๋ฒ ์ธ ์ฌ๋์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ ์์ํ์์ 1๋ฒ๊ณผ 2๋ฒ, 2๋ฒ๊ณผ 3๋ฒ์ด ์๋ก ์๊ณ ์๋ค๊ณ ํ์. 1๋ฒ์ด ๋ํ๊ฐ ๋๋ฉด 3๋ฒ์ด ๋ํ์ธ 1๋ฒ์๊ฒ ์๊ฒฌ์ ์ ๋ฌํ๊ธฐ ์ํด์ 2๋ฒ์ ๊ฑฐ์ณ์ผ๋ง ํ๋ค. ๋ฐ๋๋ก 3๋ฒ์ด ๋ํ๊ฐ ๋์ด๋ 1๋ฒ์ด ๋ํ์ธ 3๋ฒ์๊ฒ ์๊ฒฌ์ ์ ๋ฌํ๋ ค๋ฉด 2๋ฒ์ ๊ฑฐ์ณ์ผ๋ง ํ๋ค. ํ์ง๋ง 2๋ฒ์ด ๋ํ๊ฐ ๋๋ฉด 1๋ฒ๊ณผ 3๋ฒ ๋ ๋ค ์๋ฌด๋ ๊ฑฐ์น์ง ์๊ณ ๋ํ์๊ฒ ์ง์ ์๊ฒฌ์ ์ ๋ฌ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ด์ ๊ฐ์ ๊ฒฝ์ฐ 2๋ฒ์ด ๋ํ๊ฐ ๋์ด์ผ ํ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ์์ ์ฐธ์ํ๋ ์ฌ๋์ ์ N์ด ์ฃผ์ด์ง๋ค. ์ฐธ์์๋ค์ 1๋ถํฐ N๊น์ง์ ์์ฐ์๋ก ํํ๋๋ฉฐ ํ์์ ์ฐธ์ํ๋ ์ธ์์ 100 ์ดํ์ด๋ค. ๋์งธ ์ค์๋ ์๋ก ์๊ณ ์๋ ๊ด๊ณ์ ์ M์ด ์ฃผ์ด์ง๋ค. ์ด์ด M๊ฐ์ ๊ฐ ์ค์๋ ์๋ก ์๋ ์ฌ์ด์ธ ์ฐธ์์๋ฅผ ๋ํ๋ด๋ ๋๊ฐ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 8 -> n
+ * 7 -> m
+ * 1 2 -> a b
+ * 2 3 -> a b
+ * 4 5 -> a b
+ * 5 6 -> a b
+ * 4 6 -> a b
+ * 6 7 -> a b
+ * 7 4 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์๋ ๊ตฌ์ฑ๋๋ ์์ํ์ ์ K๋ฅผ ์ถ๋ ฅํ๋ค. ๋ค์ K์ค์๋ ๊ฐ ์์ํ์ ๋ํ ๋ฒํธ๋ฅผ ์์ ์๋ถํฐ ์ฐจ๋ก๋ก ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค. ํ ์์ํ์ ๋ํ๊ฐ ๋ ์ ์๋ ์ฌ๋์ด ๋ ์ด์์ผ ๊ฒฝ์ฐ ๊ทธ์ค ํ ๋ช
๋ง ์ถ๋ ฅํ๋ฉด ๋๋ค.
+ *
+ * 3
+ * 2
+ * 4
+ * 8
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 300ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 20MB
+ * * ์ธ์ด: JAVA8
+ *
+*/
+package Gold.II;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G2_2610 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m; // ์ฌ๋์, ์๋ก ์๊ณ ์๋ ๋ผ์ธ ์
+ static int[][] arr; // ์ฐ๊ฒฐ๋ ์ฌ๋๊น์ง์ ๊ฑฐ๋ฆฌ
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] parent; // ํฉ์งํฉ
+ static int[] result; // ๊ฒฐ๊ณผ
+ static HashMap> map = new HashMap<>(); // ์์ํ๋ฒํธ(ํค) : ์์ํ์ ์ํ ์ฌ๋ ๋ฆฌ์คํธ(๊ฐ)
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ floyd(); // * 2. ํ๋ก์ด๋-์์ฌ
+
+ // * 3. ๊ฒฝ๋ก๊ฐ ์๋ ์ฌ๋๋ค๋ผ๋ฆฌ UNION_FIND(ํฉ์งํฉ ์ฐพ๊ธฐ)
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (arr[i][j] != 200 && parent[i] != parent[j]) {
+ union(i, j);
+ }
+ }
+ }
+
+ // * 4. ๋ํ ์ฐพ๊ธฐ
+ find();
+
+ // * 5. ๋ํ ๋ฒํธ ์ ๋ ฌํ๊ธฐ
+ Arrays.sort(result);
+
+ // * 6. ์ ๋ต ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+ sb.append(result.length + "\n");
+
+ for (int r : result) {
+ sb.append(r + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ๋ํ ์ฐพ๊ธฐ
+ public static void find() {
+ // * ๋ชจ๋ ์ฌ๋์ ๋ํด
+ for (int i = 1; i <= n; i++) {
+ // * ํด๋น ๊ทธ๋ฃน ๋ฒํธ์ ๋ง๋ ์์ํ๊ฐ map์ ๋ฑ๋ก์๋์ด์์ผ๋ฉด ๋ฑ๋ก
+ if (!map.containsKey(parent[i])) {
+ map.put(parent[i], new ArrayList());
+ }
+ // * ํด๋น ๊ทธ๋ฃน ๋ฒํธ์ ๋ง๋ ์์ํ์ ํ์ฌ ์ธ์์ ๋ฒํธ ์ถ๊ฐ
+ map.get(parent[i]).add(i);
+ }
+
+ // * ๊ฐ ์์ํ๋ง๋ค ๋ํ๋ฅผ result์ ์ ์ฅ
+ int p = 0;
+ result = new int[map.size()];
+
+ for (int key : map.keySet()) {
+ int min = 1000;
+ int min_node = 0;
+
+ for (int node : map.get(key)) {
+ int len = findMaxLenth(node);
+ if (len < min) {
+ min = len;
+ min_node = node;
+ }
+ }
+
+ result[p++] = min_node;
+ }
+ }
+
+ // ! ํ์ฌ ์ธ์๊ณผ ์ฐ๊ฒฐ๋ ์ฌ๋๋ค์ ๊ฑฐ๋ฆฌ ์ค ์ต๋๊ฐ ์ฐพ๊ธฐ ํจ์
+ public static int findMaxLenth(int node) {
+ int max = 0;
+ for (int i = 1; i <= n; i++) {
+ if (arr[node][i] != 200) {
+ max = Math.max(max, arr[node][i]);
+ }
+ }
+ return max;
+ }
+
+ // ! ํ๋ก์ด๋ ์์ฌ ํจ์
+ public static void floyd() {
+ for (int k = 1; k <= n; k++) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (arr[i][j] >= arr[i][k] + arr[k][j]) {
+ arr[i][j] = arr[i][k] + arr[k][j];
+ }
+ }
+ }
+ }
+
+ for (int i = 1; i <= n; i++) {
+ arr[i][i] = 0;
+ }
+ }
+
+ // ! UNION_FIND
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ // ! UNION_FIND
+ public static boolean union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a == b) {
+ return false;
+ }
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+
+ return true;
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ m = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1][n+1];
+ parent = IntStream.range(0, n+1).toArray();
+
+ for (int[] a : arr) {
+ Arrays.fill(a, 200);
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ arr[a][b] = 1;
+ arr[b][a] = 1;
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/II/G2_2637.java b/java/BOJ/Gold/II/G2_2637.java
new file mode 100644
index 0000000..bdffc3a
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_2637.java
@@ -0,0 +1,135 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/2637
+ *
+ * ! ์ ๋ชฉ: ์ฅ๋๊ฐ ์กฐ๋ฆฝ
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * ์ฐ๋ฆฌ๋ ์ด๋ค ์ฅ๋๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ๋ถํ์ผ๋ก ์กฐ๋ฆฝํ์ฌ ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ด ์ฅ๋๊ฐ์ ๋ง๋๋๋ฐ๋ ๊ธฐ๋ณธ ๋ถํ๊ณผ ๊ทธ ๊ธฐ๋ณธ ๋ถํ์ผ๋ก ์กฐ๋ฆฝํ์ฌ ๋ง๋ ์ค๊ฐ ๋ถํ์ด ์ฌ์ฉ๋๋ค. ๊ธฐ๋ณธ ๋ถํ์ ๋ค๋ฅธ ๋ถํ์ ์ฌ์ฉํ์ฌ ์กฐ๋ฆฝ๋ ์ ์๋ ๋ถํ์ด๋ค. ์ค๊ฐ ๋ถํ์ ๋ ๋ค๋ฅธ ์ค๊ฐ ๋ถํ์ด๋ ๊ธฐ๋ณธ ๋ถํ์ ์ด์ฉํ์ฌ ๋ง๋ค์ด์ง๋ ๋ถํ์ด๋ค.
+ * ์๋ฅผ ๋ค์ด๋ณด์. ๊ธฐ๋ณธ ๋ถํ์ผ๋ก์ 1, 2, 3, 4๊ฐ ์๋ค. ์ค๊ฐ ๋ถํ 5๋ 2๊ฐ์ ๊ธฐ๋ณธ ๋ถํ 1๊ณผ 2๊ฐ์ ๊ธฐ๋ณธ ๋ถํ 2๋ก ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๊ฐ ๋ถํ 6์ 2๊ฐ์ ์ค๊ฐ ๋ถํ 5, 3๊ฐ์ ๊ธฐ๋ณธ ๋ถํ 3๊ณผ 4๊ฐ์ ๊ธฐ๋ณธ ๋ถํ 4๋ก ๋ง๋ค์ด์ง๋ค. ๋ง์ง๋ง์ผ๋ก ์ฅ๋๊ฐ ์์ ํ 7์ 2๊ฐ์ ์ค๊ฐ ๋ถํ 5, 3๊ฐ์ ์ค๊ฐ ๋ถํ 6๊ณผ 5๊ฐ์ ๊ธฐ๋ณธ ๋ถํ 4๋ก ๋ง๋ค์ด์ง๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ์ฅ๋๊ฐ ์์ ํ 7์ ๋ง๋๋๋ฐ ํ์ํ ๊ธฐ๋ณธ ๋ถํ์ ๊ฐ์๋ 1๋ฒ 16๊ฐ, 2๋ฒ 16๊ฐ, 3๋ฒ 9๊ฐ, 4๋ฒ 17๊ฐ์ด๋ค.
+ * ์ด์ ๊ฐ์ด ์ด๋ค ์ฅ๋๊ฐ ์์ ํ๊ณผ ๊ทธ์ ํ์ํ ๋ถํ๋ค ์ฌ์ด์ ๊ด๊ณ๊ฐ ์ฃผ์ด์ ธ ์์ ๋ ํ๋์ ์ฅ๋๊ฐ ์์ ํ์ ์กฐ๋ฆฝํ๊ธฐ ์ํ์ฌ ํ์ํ ๊ธฐ๋ณธ ๋ถํ์ ์ข
๋ฅ๋ณ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์์ฐ์ N(3 โค N โค 100)์ด ์ฃผ์ด์ง๋๋ฐ, 1๋ถํฐ N-1๊น์ง๋ ๊ธฐ๋ณธ ๋ถํ์ด๋ ์ค๊ฐ ๋ถํ์ ๋ฒํธ๋ฅผ ๋ํ๋ด๊ณ , N์ ์์ ํ์ ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์ ์ค์๋ ์์ฐ์ M(3 โค M โค 100)์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ๋ค์ M๊ฐ์ ์ค์๋ ์ด๋ค ๋ถํ์ ์์ฑํ๋๋ฐ ํ์ํ ๋ถํ๋ค ๊ฐ์ ๊ด๊ณ๊ฐ 3๊ฐ์ ์์ฐ์ X, Y, K๋ก ์ฃผ์ด์ง๋ค. ์ด ๋ป์ "์ค๊ฐ ๋ถํ์ด๋ ์์ ํ X๋ฅผ ๋ง๋๋๋ฐ ์ค๊ฐ ๋ถํ ํน์ ๊ธฐ๋ณธ ๋ถํ Y๊ฐ K๊ฐ ํ์ํ๋ค"๋ ๋ป์ด๋ค. ๋ ์ค๊ฐ ๋ถํ์ด ์๋ก๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
+ *
+ * 7 -> n
+ * 8 -> m
+ * 5 1 2 -> x y z
+ * 5 2 2 -> x y z
+ * 7 5 2 -> x y z
+ * 6 5 2 -> x y z
+ * 6 3 3 -> x y z
+ * 6 4 4 -> x y z
+ * 7 6 3 -> x y z
+ * 7 4 5 -> x y z
+ *
+ * ! ์ถ๋ ฅ
+ * ํ๋์ ์์ ํ์ ์กฐ๋ฆฝํ๋๋ฐ ํ์ํ ๊ธฐ๋ณธ ๋ถํ์ ์๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋(์ค๊ฐ ๋ถํ์ ์ถ๋ ฅํ์ง ์์), ๋ฐ๋์ ๊ธฐ๋ณธ ๋ถํ์ ๋ฒํธ๊ฐ ์์ ๊ฒ๋ถํฐ ํฐ ์์๊ฐ ๋๋๋ก ํ๋ค. ๊ฐ ์ค์๋ ๊ธฐ๋ณธ ๋ถํ์ ๋ฒํธ์ ์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ์ ๋ต์ 2,147,483,647 ์ดํ์ด๋ค.
+ *
+ * 1 16
+ * 2 16
+ * 3 9
+ * 4 17
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 80ms
+ * ๋ฉ๋ชจ๋ฆฌ: 11800KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.StringTokenizer;
+
+public class G2_2637 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, m;
+
+ // ์ด๊ธฐ ์ค์
+ static int[] basicParts, degree, result;
+ static ArrayList[] list;
+
+ // ๋ถํ ๋ฒํธ์ ๊ฐฏ์๋ฅผ ์๋ฏธํ๋ ๋
ธ๋ ํด๋์ค
+ public static class Node {
+ int num;
+ int count;
+
+ public Node(int num, int count) {
+ this.num = num;
+ this.count = count;
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ topologicalSort(); // * ์์ ์ ๋ ฌ
+
+ // * ๊ธฐ๋ณธ๋ถํ์ธ ๊ฒฝ์ฐ์๋ง ํ์ํ ๋ถํ์ ์ถ๋ ฅ
+ for (int i = 1; i <= n; i++) {
+ if (basicParts[i] == 0) {
+ bw.write(String.valueOf(i) + " " + String.valueOf(result[i]) + "\n");
+ }
+ }
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์์ ์ ๋ ฌ
+ public static void topologicalSort() {
+ LinkedList queue = new LinkedList<>();
+ queue.add(new Node(n, 1)); // ์์ ํ ๋ฒํธ(n)์ ๊ฐฏ์(1)์ ์ฝ์
+ result[n] = 1; // ํ์ํ ์์ ํ์ ๊ฐฏ์ 1๋ก ์ค์
+
+ while (!queue.isEmpty()) {
+ Node cur = queue.poll();
+
+ // * ํ์ฌ ๋ถํ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ถํ๋ค์ ๋ํ์ฌ
+ for (Node next: list[cur.num]) {
+ result[next.num] += result[cur.num] * next.count; // * ํ์ฌ ๋ถํ์ ํ์ํ ๊ฐ์ x ํ์ฌ ๋ถํ 1๊ฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ถ์ ๋ถํ์ ๊ฐ์
+ // * ๋์ด์ ํด๋น ๋ถ์ ๋ถํ์ ํ์๋กํ๋ ์์ ๋ถํ์ด ์์ ๋
+ if (--degree[next.num] == 0) {
+ queue.add(new Node(next.num, result[next.num])); // * ํ์ ์ฝ์
+ }
+ }
+ }
+ }
+
+ // * ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ m = Integer.parseInt(br.readLine());
+
+ list = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ list[i] = new ArrayList<>();
+ }
+
+ basicParts = new int[n+1];
+ degree = new int[n+1];
+ result = new int[n+1];
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int x = Integer.parseInt(st.nextToken());
+ int y = Integer.parseInt(st.nextToken());
+ int z = Integer.parseInt(st.nextToken());
+
+ list[x].add(new Node(y, z));
+ basicParts[x]++;
+ degree[y]++;
+
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_2933.java b/java/BOJ/Gold/II/G2_2933.java
new file mode 100644
index 0000000..c566634
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_2933.java
@@ -0,0 +1,224 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/2933
+ *
+ * ! ์ ๋ชฉ: ๋ฏธ๋ค๋
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * ์ฐฝ์๊ณผ ์๊ทผ์ ํ ๋๊ตด์ ๋๊ณ ์์ ๊ถ์ ์ฃผ์ฅํ๊ณ ์๋ค. ๋ ์ฌ๋์ ๋ง๋๊ธฐ๋ฅผ ์๋ก์๊ฒ ๋์ง๋ ๋ฐฉ๋ฒ์ ์ด์ฉํด ๋๊ตฌ์ ์์ ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ๋ก ํ๋ค. ์ธ์์ ๋๊ตด์์ ๋ฒ์ด์ง๋ค. ๋๊ตด์๋ ๋ฏธ๋ค๋์ด ์ ์ฅ๋์ด ์์ผ๋ฉฐ, ๋์ง ๋ง๋๊ธฐ๊ฐ ๋ฏธ๋ค๋์ ํ๊ดดํ ์๋ ์๋ค.
+ * ๋๊ตด์ Rํ C์ด๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, RรC์นธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ์นธ์ ๋น์ด์๊ฑฐ๋ ๋ฏธ๋ค๋์ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๋ค ๋ฐฉํฅ ์ค ํ๋๋ก ์ธ์ ํ ๋ฏธ๋ค๋์ด ํฌํจ๋ ๋ ์นธ์ ๊ฐ์ ํด๋ฌ์คํฐ์ด๋ค.
+ * ์ฐฝ์์ ๋๊ตด์ ์ผ์ชฝ์ ์์๊ณ , ์๊ทผ์ ์ค๋ฅธ์ชฝ์ ์์๋ค. ๋ ์ฌ๋์ ํด์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋ง๋๊ธฐ๋ฅผ ๋์ง๋ค. ๋ง๋๋ฅผ ๋์ง๊ธฐ ์ ์ ๋์ง ๋์ด๋ฅผ ์ ํด์ผ ํ๋ค. ๋ง๋๋ ๋
๊ณผ ์ํ์ ์ด๋ฃจ๋ฉฐ ๋ ์๊ฐ๋ค.
+ * ๋ง๋๊ฐ ๋ ์๊ฐ๋ค๊ฐ ๋ฏธ๋ค๋์ ๋ง๋๋ฉด, ๊ทธ ์นธ์ ์๋ ๋ฏธ๋ค๋์ ๋ชจ๋ ํ๊ดด๋๊ณ ๋ง๋๋ ๊ทธ ์๋ฆฌ์์ ์ด๋์ ๋ฉ์ถ๋ค.
+ * ๋ฏธ๋ค๋์ด ํ๊ดด๋ ์ดํ์ ๋จ์ ํด๋ฌ์คํฐ๊ฐ ๋ถ๋ฆฌ๋ ์๋ ์๋ค. ์๋กญ๊ฒ ์์ฑ๋ ํด๋ฌ์คํฐ๊ฐ ๋ ์๋ ๊ฒฝ์ฐ์๋ ์ค๋ ฅ์ ์ํด์ ๋ฐ๋ฅ์ผ๋ก ๋จ์ด์ง๊ฒ ๋๋ค. ๋จ์ด์ง๋ ๋์ ํด๋ฌ์คํฐ์ ๋ชจ์์ ๋ณํ์ง ์๋๋ค. ํด๋ฌ์คํฐ๋ ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ ๋
์ ๋ง๋๊ธฐ ์ ๊น์ง ๊ฒ์ํด์ ๋จ์ด์ง๋ค. ํด๋ฌ์คํฐ๋ ๋ค๋ฅธ ํด๋ฌ์คํฐ ์์ ๋จ์ด์ง ์ ์๊ณ , ๊ทธ ์ดํ์๋ ํฉ์ณ์ง๊ฒ ๋๋ค.
+ * ๋๊ตด์ ์๋ ๋ฏธ๋ค๋์ ๋ชจ์๊ณผ ๋ ์ฌ๋์ด ๋์ง ๋ง๋์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋ชจ๋ ๋ง๋๋ฅผ ๋์ง๊ณ ๋ ์ดํ์ ๋ฏธ๋ค๋ ๋ชจ์์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋๊ตด์ ํฌ๊ธฐ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. (1 โค R,C โค 100)
+ * ๋ค์ R๊ฐ ์ค์๋ C๊ฐ์ ๋ฌธ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, '.'๋ ๋น ์นธ, 'x'๋ ๋ฏธ๋ค๋์ ๋ํ๋ธ๋ค.
+ * ๋ค์ ์ค์๋ ๋ง๋๋ฅผ ๋์ง ํ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 100)
+ * ๋ง์ง๋ง ์ค์๋ ๋ง๋๋ฅผ ๋์ง ๋์ด๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด์ ธ ์๋ค. ๋ชจ๋ ๋์ด๋ 1๊ณผ R์ฌ์ด์ด๋ฉฐ, ๋์ด 1์ ํ๋ ฌ์ ๊ฐ์ฅ ๋ฐ๋ฅ, R์ ๊ฐ์ฅ ์๋ฅผ ์๋ฏธํ๋ค. ์ฒซ ๋ฒ์งธ ๋ง๋๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์ก์ผ๋ฉฐ, ๋ ๋ฒ์งธ๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก, ์ด์ ๊ฐ์ ์์ผ๋ก ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋์ง๋ค.
+ * ๊ณต์ค์ ๋ ์๋ ๋ฏธ๋ค๋ ํด๋ฌ์คํฐ๋ ์์ผ๋ฉฐ, ๋ ๊ฐ ๋๋ ๊ทธ ์ด์์ ํด๋ฌ์คํฐ๊ฐ ๋์์ ๋จ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค. ํด๋ฌ์คํฐ๊ฐ ๋จ์ด์ง ๋, ๊ทธ ํด๋ฌ์คํฐ ๊ฐ ์ด์ ๋งจ ์๋ ๋ถ๋ถ ์ค ํ๋๊ฐ ๋ฐ๋ฅ ๋๋ ๋ฏธ๋ค๋ ์๋ก ๋จ์ด์ง๋ ์
๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
+ *
+ * 5 6 -> n m
+ * ...... -> arr[0][0] ~ arr[0][m-1]
+ * ..xx..
+ * ..x...
+ * ..xx..
+ * .xxxx. -> arr[n-1][0] ~ arr[n-1][m-1]
+ * 1 -> c
+ * 3 -> throwing[0] ~ throwing[c-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์
๋ ฅ ํ์๊ณผ ๊ฐ์ ํ์์ผ๋ก ๋ฏธ๋ค๋ ๋ชจ์์ ์ถ๋ ฅํ๋ค.
+ *
+ * ......
+ * ......
+ * ..xx..
+ * ..xx..
+ * .xxxx.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 144ms
+ * ๋ฉ๋ชจ๋ฆฌ: 14MB
+ * ์ธ์ด: JAVA8
+ **/
+package Gold.II;
+
+import java.io.*;
+import java.util.*;
+
+public class G2_2933 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m, c;
+ static char[][] arr;
+ static int[] throwing;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[][] visited;
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ // * ๋ง๋๊ธฐ ๋์ง๋ ๋จ๊ณ๋ง๋ค ๋ถ๋ฆฌ๋ ํด๋ฆฌ์คํฐ
+ static ArrayList cluster;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ throwStick(); // * ๋ฒ๊ฐ์๊ฐ๋ฉด์ ๋ง๋๊ธฐ ๋์ง๊ธฐ
+
+ // * ์ถ๋ ฅ
+ StringBuffer sb= new StringBuffer();
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ sb.append(arr[i][j]);
+ }
+ sb.append("\n");
+ }
+ bw.write(String.valueOf(sb.toString()));
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ๋ง๋๊ธฐ ๋์ง๊ธฐ
+ public static void throwStick() {
+ for (int i = 0; i < throwing.length; i++) {
+ visited = new boolean[n][m];
+ // * ๋ง๋๊ธฐ์ ๋ถ๋ชํ ํด๋ฌ์คํฐ ์ฐพ๊ธฐ
+ int tx = n - throwing[i];
+ int ty = -1;
+
+ if (i % 2 == 0) {
+ for (int j = 0; j < m; j++) {
+ if (arr[tx][j] == 'x') {
+ ty = j;
+ break;
+ }
+ }
+ } else {
+ for (int j = m-1; j >= 0; j--) {
+ if (arr[tx][j] == 'x') {
+ ty = j;
+ break;
+ }
+ }
+ }
+
+ if (ty == -1) continue; // * ๋ถ๋ชํ ํด๋ฌ์คํฐ๊ฐ ์๋ค๋ฉด ํจ์ค
+ arr[tx][ty] = '.'; // * ํด๋น ์์น์ ๋ฏธ๋ค๋ ๋ถ์๊ธฐ
+ // * ๋ฐ๋ฅ๊ณผ ์ฐ๊ฒฐ๋ ํด๋ฌ์คํฐ๋ค ๋ฐฉ๋ฌธ ํ์
+ floor();
+
+ // * ๋ฐฉ๋ฌธํ์ ์ ๋ ํด๋ฌ์คํฐ๋ค ๋ฐ๋ฐ๋ฅ๊น์ง ๋จ๊ตฌ๊ธฐ(๋จ๊ตด ๋ ๋ชจ์ ๋ฐ๊พธ์ง ์๊ธฐ)
+ // * ๋์ค์ ํด๋ฌ์คํฐ๋ ๋ฐ๋ฅ์ ๋ง๋๋ฉด ์ข
๋ฃ
+ findCluster(tx, ty);
+ }
+ }
+
+ // ! ๋ฐ๋ฅ๊ณผ ์ฐ๊ฒฐ๋ ํด๋ฌ์คํธ๋ค์ ๋ฐฉ๋ฌธํ์ํ๊ธฐ
+ public static void floor() {
+ for (int i = 0; i < m; i++) {
+ if (arr[n-1][i] == 'x') {
+ visited[n-1][i] = true;
+ dfs(n-1, i);
+ }
+ }
+ }
+
+ // ! ์ผ๋ฐ DFS
+ public static void dfs(int x, int y) {
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (0 <= nx && nx < n && 0 <= ny && ny < m && !visited[nx][ny] && arr[nx][ny] == 'x') {
+ visited[nx][ny] = true;
+ dfs(nx, ny);
+ }
+ }
+ }
+
+ // ! ๋ถ๋ฆฌ๋ ํด๋ฌ์คํฐ๋ฉ์ด๋ฆฌ๋ฅผ ์ฐพ๊ณ ๋ฐ๋ฅ์ผ๋ก ๋จ์ด๋จ๋ฆฌ๊ธฐ
+ public static void findCluster(int x, int y) {
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ // * ๋ฒ์ + ๋ฐฉ๋ฌธ์ฌ๋ถ + ๊ฐ ์ฒดํฌ
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m || visited[nx][ny] || arr[nx][ny] != 'x') continue;
+
+ int p = 0;
+ cluster = new ArrayList<>(); // * ํด๋ฌ์คํฐ ์ด๊ธฐํ
+ cluster.add(new int[] {nx, ny});
+ visited[nx][ny] = true;
+
+ while (p < cluster.size()) {
+ int[] cur = cluster.get(p++);
+
+ for (int k = 0; k < 4; k++) {
+ int nx2 = cur[0] + dx[k];
+ int ny2 = cur[1] + dy[k];
+
+ if (0 <= nx2 && nx2 < n && 0 <= ny2 && ny2 < m && !visited[nx2][ny2] && arr[nx2][ny2] == 'x') {
+ visited[nx2][ny2] = true;
+ cluster.add(new int[] {nx2, ny2});
+
+ }
+ }
+ }
+
+ down(); // * ๋ฐ๋ฅ์ผ๋ก ๋จ์ด๋จ๋ฆฌ๊ธฐ
+ break; // * ํด๋ฌ์คํฐ๊ฐ ๋๊ฐ ์ด์ ํ๋ฒ์ ๋จ์ด์ง์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋จ์ด์ก๋ค๋ฉด ์ข
๋ฃ
+ }
+ }
+
+ // ! ๋ถ๋ฆฌ๋ ํด๋ฌ์คํฐ๋ฅผ ๋จ์ด๋จ๋ฆฌ๊ธฐ(์ค๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋๊ฑฐ๋ ๋ฐ๋ฅ๊ณผ ๋ฟ์ผ๋ฉด ๋ค์ ์์๋ณต๊ท ์ํค๊ณ ์ข
๋ฃ)
+ public static void down() {
+ while (true) {
+ for (int[] cur: cluster) {
+ arr[cur[0]][cur[1]] = '.';
+ }
+
+ for (int[] cur: cluster) {
+ if (cur[0]+1 == n || arr[cur[0]+1][cur[1]] == 'x') {
+ for (int[] cur2: cluster) {
+ arr[cur2[0]][cur2[1]] = 'x';
+ }
+ return;
+ }
+ }
+
+ for (int[] cur: cluster) {
+ arr[cur[0]+1][cur[1]] = 'x';
+ cur[0] += 1;
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ c = Integer.parseInt(br.readLine());
+ throwing = new int[c];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < c; i++) {
+ throwing[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Gold/II/G2_4991.java b/java/BOJ/Gold/II/G2_4991.java
new file mode 100644
index 0000000..4196c73
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_4991.java
@@ -0,0 +1,222 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง
+ * ? https://www.acmicpc.net/problem/4991
+ *
+ * ? ์ ๋ชฉ: ๋ก๋ด ์ฒญ์๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ค๋์ ์ง์ฌ๊ฐํ ๋ชจ์์ ๋ฐฉ์ ๋ก๋ด ์ฒญ์๊ธฐ๋ฅผ ์ด์ฉํด ์ฒญ์ํ๋ ค๊ณ ํ๋ค. ์ด ๋ก๋ด ์ฒญ์๊ธฐ๋ ์ ์ ๊ฐ ์ง์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ์ ์๋ค.
+ * ๋ฐฉ์ ํฌ๊ธฐ๊ฐ 1ร1์ธ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ, ๋ก๋ด ์ฒญ์๊ธฐ์ ํฌ๊ธฐ๋ 1ร1์ด๋ค. ์นธ์ ๊นจ๋ํ ์นธ๊ณผ ๋๋ฌ์ด ์นธ์ผ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ, ๋ก๋ด ์ฒญ์๊ธฐ๋ ๋๋ฌ์ด ์นธ์ ๋ฐฉ๋ฌธํด์ ๊นจ๋ํ ์นธ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
+ * ์ผ๋ถ ์นธ์๋ ๊ฐ๊ตฌ๊ฐ ๋์ฌ์ ธ ์๊ณ , ๊ฐ๊ตฌ์ ํฌ๊ธฐ๋ 1ร1์ด๋ค. ๋ก๋ด ์ฒญ์๊ธฐ๋ ๊ฐ๊ตฌ๊ฐ ๋์ฌ์ง ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค.
+ * ๋ก๋ด์ ํ ๋ฒ ์์ง์ผ ๋, ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค. ๋, ๋ก๋ด์ ๊ฐ์ ์นธ์ ์ฌ๋ฌ ๋ฒ ๋ฐฉ๋ฌธํ ์ ์๋ค.
+ * ๋ฐฉ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ๋๋ฌ์ด ์นธ์ ๋ชจ๋ ๊นจ๋ํ ์นธ์ผ๋ก ๋ง๋๋๋ฐ ํ์ํ ์ด๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ
์คํธ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ๋ฐฉ์ ๊ฐ๋ก ํฌ๊ธฐ w์ ์ธ๋ก ํฌ๊ธฐ h๊ฐ ์ฃผ์ด์ง๋ค. (1 โค w, h โค 20) ๋์งธ ์ค๋ถํฐ h๊ฐ์ ์ค์๋ ๋ฐฉ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋ฐฉ์ ์ ๋ณด๋ 4๊ฐ์ง ๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ ๋ฌธ์์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+ *
+ * [ .: ๊นจ๋ํ ์นธ ]
+ * [ *: ๋๋ฌ์ด ์นธ ]
+ * [ x: ๊ฐ๊ตฌ ]
+ * [ o: ๋ก๋ด ์ฒญ์๊ธฐ์ ์์ ์์น ]
+ * ๋๋ฌ์ด ์นธ์ ๊ฐ์๋ 10๊ฐ๋ฅผ ๋์ง ์์ผ๋ฉฐ, ๋ก๋ด ์ฒญ์๊ธฐ์ ๊ฐ์๋ ํญ์ ํ๋์ด๋ค.
+ * ์
๋ ฅ์ ๋ง์ง๋ง ์ค์๋ 0์ด ๋ ๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 7 5 -> m n
+ * ....... -> arr[0][0] ~ arr[0][m-1]
+ * .o...*.
+ * .......
+ * .*...*.
+ * ....... -> arr[n-1][0] ~ arr[n-1][m-1]
+ * 15 13 -> m n
+ * .......x....... -> arr[0][0] ~ arr[0][m-1]
+ * ...o...x....*..
+ * .......x.......
+ * .......x.......
+ * .......x.......
+ * ...............
+ * xxxxx.....xxxxx
+ * ...............
+ * .......x.......
+ * .......x.......
+ * .......x.......
+ * ..*....x....*..
+ * .......x....... -> arr[n-1][0] ~ arr[n-1][m-1]
+ * 10 10 -> m n
+ * .......... -> arr[0][0] ~ arr[0][m-1]
+ * ..o.......
+ * ..........
+ * ..........
+ * ..........
+ * .....xxxxx
+ * .....x....
+ * .....x.*..
+ * .....x....
+ * .....x.... -> arr[n-1][0] ~ arr[n-1][m-1]
+ * 0 0 m n
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค๋ง๋ค ๋๋ฌ์ด ์นธ์ ๋ชจ๋ ๊นจ๋ํ ์นธ์ผ๋ก ๋ฐ๊พธ๋ ์ด๋ ํ์์ ์ต์๊ฐ์ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค. ๋ง์ฝ, ๋ฐฉ๋ฌธํ ์ ์๋ ๋๋ฌ์ด ์นธ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 8
+ * 49
+ * -1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 512ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 19MB
+ * * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.*;
+
+public class G2_4991 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ์ด๊ธฐ ์ค์
+ static int n, m; // ํ, ์ด์ ๊ฐฏ์
+ static int[] robot; // ๋ก๋ด์ฒญ์๊ธฐ์ ์์น
+ static char[][] arr; // ๋ฐฉ ์ ๋ณด
+
+ // * ์ด๊ธฐ ์ค์
+ static int count; // ๋จผ์ง์ ์ + 1
+ static int minDist; // ์ด๋ ํ์์ ์ต์๊ฐ
+ static boolean[][] visited; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ
+ static int[] sequence; // ๋จผ์ง๋ฅผ ๊ณ ๋ฅด๋ ์์(์์ด)
+ static int[][] dustNum; // ๊ฐ์์น์ ๋จผ์ง๋ฒํธ
+ static int[][] dist; // ์ฒญ์๊ธฐ-๋จผ์ง, ๋จผ์ง-๋จผ์ง ์ฌ์ด์ ์ต์ ์ด๋ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
+ static ArrayList dusts; // ๋จผ์ง์ ์์น ๋ฆฌ์คํธ
+
+ // * ์ํ์ข์ฐ(์ธ์ )
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ StringBuffer sb = new StringBuffer(); // ์ ๋ต ์ถ๋ ฅ์ฉ ์คํธ๋ง๋ฒํผ
+
+ // * ๋ชจ๋ ์ผ์ด์ค๋ง๋ค
+ while (true) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ์ข
๋ฃ ์๊ทธ๋
+ if (n == 0 && m == 0) {
+ break;
+ }
+
+ // * 3. BFS๋ฅผ ์ด์ฉํด ์ฒญ์๊ธฐ-๋จผ์ง, ๋จผ์ง-๋จผ์ง์ฌ์ด์ ๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
+ bfs(robot[0], robot[1]);
+ for (int[] dust: dusts) {
+ bfs(dust[0], dust[1]);
+ }
+
+ // * 4. ์์ด์ ์ด์ฉํ์ฌ ๋ชจ๋ ์์์ ๋ํด ์ด๋ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ๊ฐฑ์
+ permutation(1, 1);
+
+ // * 5. ํด๋น ์ผ์ด์ค์ ๊ฒฐ๊ณผ๋ฅผ ์คํธ๋ง๋ฒํผ์ ์ถ๊ฐ
+ sb.append(minDist + "\n");
+ }
+
+ // * 6. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์์ด์ ์ด์ฉํ์ฌ ๋จผ์ง๋ฅผ ๊ณ ๋ฅด๋ ๋ชจ๋ ์์์ ๋ํด ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ์ต์๊ฐ์ ๊ฐฑ์ ํ๋ ํจ์
+ public static void permutation(int cnt, int flag) {
+ if (cnt == count) {
+ int distance = 0;
+ for (int i = 0; i < sequence.length - 1; i++) {
+ if (dist[sequence[i]][sequence[i+1]] == 0) {
+ minDist = -1;
+ return;
+ }
+ distance += dist[sequence[i]][sequence[i+1]];
+ }
+
+ minDist = Math.min(minDist, distance);
+ return;
+ }
+
+ for (int i = 1; i < count; i++) {
+ if ((flag & (1 << i)) != 0) {
+ continue;
+ }
+
+ sequence[cnt] = i;
+ permutation(cnt+1, flag | (1 << i));
+ }
+ }
+
+ // ! BFS๋ฅผ ์ด์ฉํ์ฌ ์ฒญ์๊ธฐ-๋จผ์ง, ๋จผ์ง-๋จผ์ง์ ๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์
+ public static void bfs(int x, int y) {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {x, y, 0});
+ visited = new boolean[n][m];
+ visited[x][y] = true;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+ int c = cur[2];
+
+ // ๋จผ์ง์ ๋์ฐฉํ์ ๋ ์์ ๋จผ์ง ๋ฒํธ์ ํ์ฌ ๋์ฐฉํ ๋จผ์ง ๋ฒํธ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅ
+ if (arr[cur[0]][cur[1]] == '*') {
+ dist[dustNum[x][y]][dustNum[cur[0]][cur[1]]] = c;
+ }
+
+ // ์ํ์ข์ฐ์ ๋ํ์ฌ
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ // ๋ฒ์์ฒดํฌ + ๋ฐฉ๋ฌธ์ฒดํฌ + ๊ฐ๊ตฌ์ธ์ง ์ฒดํฌ ํ ๋ฐฉ๋ฌธํ์ ๋ฐ ํ์ ์ฝ์
+ if (0 <= nx && nx < n && 0 <= ny && ny < m && !visited[nx][ny] && arr[nx][ny] != 'x') {
+ visited[nx][ny] = true;
+ queue.add(new int[] {nx, ny, c+1});
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ m = Integer.parseInt(st.nextToken());
+ n = Integer.parseInt(st.nextToken());
+
+ minDist = 50000;
+ arr = new char[n][m];
+ dustNum = new int[n][m];
+ visited = new boolean[n][m];
+ dusts = new ArrayList<>();
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ count = 1;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (arr[i][j] == '*') {
+ dustNum[i][j] = count;
+ dusts.add(new int[] {i, j});
+ count++;
+ } else if (arr[i][j] == 'o') {
+ robot = new int[] {i, j};
+ }
+ }
+ }
+ dist = new int[count][count];
+ sequence = new int[count];
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/II/G2_5214.java b/java/BOJ/Gold/II/G2_5214.java
new file mode 100644
index 0000000..88cdcc6
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_5214.java
@@ -0,0 +1,188 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/5214
+ *
+ * ? ์ ๋ชฉ: ํ์น
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ฃผ ๋จผ ๋ฏธ๋์ ์ฌ๋๋ค์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋์ค๊ตํต์ ํ์ดํผํ๋ธ์ด๋ค. ํ์ดํผํ๋ธ ํ๋๋ ์ญ K๊ฐ๋ฅผ ์๋ก ์ฐ๊ฒฐํ๋ค. 1๋ฒ์ญ์์ N๋ฒ์ญ์ผ๋ก ๊ฐ๋๋ฐ ๋ฐฉ๋ฌธํ๋ ์ต์ ์ญ์ ์๋ ๋ช ๊ฐ์ผ๊น?
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ญ์ ์ N๊ณผ ํ ํ์ดํผํ๋ธ๊ฐ ์๋ก ์ฐ๊ฒฐํ๋ ์ญ์ ๊ฐ์ K, ํ์ดํผํ๋ธ์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 100,000, 1 โค K, M โค 1000)
+ * ๋ค์ M๊ฐ ์ค์๋ ํ์ดํผํ๋ธ์ ์ ๋ณด๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ์ด K๊ฐ ์ซ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์ด ์ซ์๋ ๊ทธ ํ์ดํผํ๋ธ๊ฐ ์๋ก ์ฐ๊ฒฐํ๋ ์ญ์ ๋ฒํธ์ด๋ค.
+ *
+ * 9 3 5 -> n, k, m
+ * 1 2 3 s
+ * 1 4 5
+ * 3 6 7
+ * 5 6 7
+ * 6 8 9
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ 1๋ฒ์ญ์์ N๋ฒ์ญ์ผ๋ก ๊ฐ๋๋ฐ ๋ฐฉ๋ฌธํ๋ ์ญ์ ๊ฐ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ, ๊ฐ ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 470ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 77MB
+ * * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.*;
+
+public class G2_5214 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ
+ static int n, k, m;
+ static ArrayList[] station;
+ static ArrayList[] tube;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] stationVisited;
+ static int[] tubeVisited;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bfs(); // * 2. ์ญ๊ณผ ํ๋ธ๋ฅผ ๋ชจ๋ ์ ์ ์ผ๋ก ๊ฐ์ฃผํ๊ณ BFS
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ bw.write(String.valueOf(stationVisited[n] == 0 ? -1 : stationVisited[n]));
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {1, 1});
+ stationVisited[1] = 1;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll(); // cur[0]: number, cur[1] : isStation
+
+ if (cur[1] == 1) { // station
+ for (int nextTube : station[cur[0]]) {
+ if (tubeVisited[nextTube] == 0) {
+ tubeVisited[nextTube] = stationVisited[cur[0]];
+ queue.add(new int[] {nextTube, 0});
+ }
+ }
+ } else { // tube
+ for (int nextStation : tube[cur[0]]) {
+ if (stationVisited[nextStation] == 0) {
+ stationVisited[nextStation] = tubeVisited[cur[0]] + 1;
+ queue.add(new int[] {nextStation, 1});
+
+ if (nextStation == n) {
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ InputReader in = new InputReader(System.in);
+
+ n = in.readInt();
+ k = in.readInt();
+ m = in.readInt();
+
+ station = new ArrayList[n+1];
+ tube = new ArrayList[m+1];
+ stationVisited = new int[n+1];
+ tubeVisited= new int[m+1];
+
+ for (int i = 1; i <= n; i++) {
+ station[i] = new ArrayList<>();
+ }
+
+ for (int i = 1; i <= m; i++) {
+ tube[i] = new ArrayList<>();
+ }
+
+ for (int i = 1; i <= m; i++) {
+ for (int j = 0; j < k; j++) {
+ int s = in.readInt();
+ tube[i].add(s);
+ station[s].add(i);
+ }
+ }
+ }
+
+ // ! INPUT ์๋ ์ฆ๊ฐ
+ private static class InputReader {
+ private InputStream stream;
+ private byte[] buf = new byte[1024];
+ private int curChar;
+ private int numChars;
+ private SpaceCharFilter filter;
+
+ public InputReader(InputStream stream) {
+ this.stream = stream;
+ }
+
+ public int read() {
+ if (numChars == -1) {
+ throw new InputMismatchException();
+ }
+ if (curChar >= numChars) {
+ curChar = 0;
+ try {
+ numChars = stream.read(buf);
+ } catch (IOException e) {
+ throw new InputMismatchException();
+ }
+ if (numChars <= 0) {
+ return -1;
+ }
+ }
+ return buf[curChar++];
+ }
+
+ public int readInt() {
+ int c = read();
+ while (isSpaceChar(c)) {
+ c = read();
+ }
+ int sgn = 1;
+ if (c == '-') {
+ sgn = -1;
+ c = read();
+ }
+ int res = 0;
+ do {
+ if (c < '0' || c > '9') {
+ throw new InputMismatchException();
+ }
+ res *= 10;
+ res += c - '0';
+ c = read();
+ } while (!isSpaceChar(c));
+ return res * sgn;
+ }
+
+ public boolean isSpaceChar(int c) {
+ if (filter != null) {
+ return filter.isSpaceChar(c);
+ }
+ return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
+ }
+
+ public interface SpaceCharFilter {
+ public boolean isSpaceChar(int ch);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/II/G2_9527.java b/java/BOJ/Gold/II/G2_9527.java
new file mode 100644
index 0000000..0dbd169
--- /dev/null
+++ b/java/BOJ/Gold/II/G2_9527.java
@@ -0,0 +1,85 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/9527
+ *
+ * ! ์ ๋ชฉ: 1์ ๊ฐ์ ์ธ๊ธฐ
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * ๋ ์์ฐ์ A, B๊ฐ ์ฃผ์ด์ก์ ๋, A โค x โค B๋ฅผ ๋ง์กฑํ๋ ๋ชจ๋ x์ ๋ํด x๋ฅผ ์ด์ง์๋ก ํํํ์ ๋ 1์ ๊ฐ์์ ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์ฆ, f(x) = x๋ฅผ ์ด์ง์๋ก ํํ ํ์ ๋ 1์ ๊ฐ์๋ผ๊ณ ์ ์ํ๊ณ , ์๋ ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ์.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ์ค์ ๋ ์์ฐ์ A, B๊ฐ ์ฃผ์ด์ง๋ค. (1 โค A โค B โค 1016)
+ *
+ * 2 12 -> a b
+ *
+ * ! ์ถ๋ ฅ
+ * 1์ ๊ฐ์๋ฅผ ์ธ์ด ์ถ๋ ฅํ๋ค.
+ *
+ * 21
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 76ms
+ * ๋ฉ๋ชจ๋ฆฌ: 11636KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.II;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G2_9527 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static long a, b;
+
+ // ! ์ด๊ธฐ ์ค์ : 1์ ๊ฐฏ์ ๋์ ํฉ => arr[n]: 2์ง๋ฒ n์ ์๋ฆฌ์๊น์ง์ 1์ ๊ฐ์์ ์ดํฉ
+ static long[] arr = new long[55];
+
+ // ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // ์
๋ ฅ ๋ฐ๊ธฐ
+ arr[0] = 0L; // ์ด๊ธฐ๊ฐ ์ค์
+
+ // ! ์ ํ์์ ์ด์ฉํ ๋์ ํฉ ๊ตฌํ๊ธฐ
+ for (int i = 1; i <= 54; i++) {
+ arr[i] = (long) Math.pow(2, i-1) + 2 * arr[i-1];
+ }
+
+ // ! b ๊น์ง์ 1์๊ฐ์ ๋์ ํฉ - (a-1)๊น์ง์ 1์๊ฐ์ ๋์ ํฉ ์ถ๋ ฅ
+ bw.write(String.valueOf(getOne(b) - getOne(a-1)));
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ๋์ ํฉ๊ตฌํ๊ธฐ
+ public static long getOne(long num) {
+ long answer = 0L;
+ String bin_num = Long.toBinaryString(num);
+ int length = bin_num.length();
+ for (int i = 0; i < length; i++) {
+ if (bin_num.charAt(i) == '1') {
+ int pow = length - i - 1;
+ answer += num - ((long) Math.pow(2, pow) - 1);
+ answer += arr[pow];
+ num -= (long) Math.pow(2, pow);
+ }
+ }
+ return answer;
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ a = Long.parseLong(st.nextToken());
+ b = Long.parseLong(st.nextToken());
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/III/G3_1039.java b/java/BOJ/Gold/III/G3_1039.java
new file mode 100644
index 0000000..3e55057
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_1039.java
@@ -0,0 +1,110 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/1039
+ *
+ * ! ์ ๋ชฉ: ๊ตํ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * 0์ผ๋ก ์์ํ์ง ์๋ ์ ์ N์ด ์ฃผ์ด์ง๋ค. ์ด๋, M์ ์ ์ N์ ์๋ฆฟ์๋ผ๊ณ ํ์ ๋, ๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์ K๋ฒ ์ํํ๋ค.
+ * 1 โค i < j โค M์ธ i์ j๋ฅผ ๊ณ ๋ฅธ๋ค. ๊ทธ ๋ค์, i๋ฒ ์์น์ ์ซ์์ j๋ฒ ์์น์ ์ซ์๋ฅผ ๋ฐ๊พผ๋ค. ์ด๋, ๋ฐ๊พผ ์๊ฐ 0์ผ๋ก ์์ํ๋ฉด ์ ๋๋ค.
+ * ์์ ์ฐ์ฐ์ K๋ฒ ํ์ ๋, ๋์ฌ ์ ์๋ ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ ์ N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ค. N์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , K๋ 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 16375 1 -> num, k
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฌธ์ ์ ์ฃผ์ด์ง ์ฐ์ฐ์ K๋ฒ ํ์ ๋, ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ์ฐ์ฐ์ K๋ฒ ํ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 76315
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 204ms
+ * ๋ฉ๋ชจ๋ฆฌ: 59540KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.LinkedList;
+
+public class G3_1039 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // ํ์ฑ
+ static int num, k;
+
+ // ์ด๊ธฐ ์ค์
+ static int max = 0;
+ static int[][] visited;
+
+ // * ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ String[] str = br.readLine().split(" ");
+ num = Integer.parseInt(str[0]);
+ k = Integer.parseInt(str[1]);
+ visited = new int[k+1][1000001];
+
+ bfs(num); // ! BFS
+ bw.write(String.valueOf(max == 0 ? -1 : max)); // * ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static void bfs(int start) {
+ LinkedList queue = new LinkedList<>();
+ queue.add(new int[] {start, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+ int num = cur[0]; // * ํ์ฌ ์ซ์
+ int count = cur[1]; // * ํ์ฌ ์ซ์์ ์๋ฆฟ์ ๊ตํ ํ์
+
+ if (count == k) continue; // * K๋ฒ๋งํผ ๋ฐ๊ฟจ๋ค๋ฉด ํจ์ค
+
+ String s = Integer.toString(num); // * ํ์ฌ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํ
+ for (int i = 0; i < s.length()-1; i++) {
+ for (int j = i+1; j < s.length(); j++) {
+ if (i == 0 && s.charAt(j) == '0') continue; // * ๋งจ ์์๋ฆฌ์ 0์ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ๊ฐ ์์ด
+
+ String newStr = swap(s, i, j); // * ๋ฌธ์์ด์ i์ j๋ฅผ ์ค์ํ ๋ฌธ์์ด์ ๋ฐํ
+ int newNum = Integer.parseInt(newStr);// * ์ ๋ฌธ์์ด์ ๋ค์ ์ซ์๋ก ๋ณํ
+
+ // * count+1 ํ์๋ก newNum์ ์ซ์๋ก ๋๋ฌํ ๊ฒฝ์ฐ๊ฐ ์์ ๋๋ง
+ if (visited[count+1][newNum] == 0) {
+ visited[count+1][newNum] = 1; // * ๋ฐฉ๋ฌธํ์ ํ
+ queue.add(new int[] {newNum, count+1}); // * ํ์ ์ฝ์
+ }
+ }
+ }
+ }
+
+ // * visited[k]์ ์ซ์๋ค ์ค (์ด K๋ฒ ๊ตํ์ด ์๋ฃ๋ ์ซ์๋ค ์ค)
+ for (int i = 0; i < visited[k].length; i++) {
+ if (visited[k][i] != 0) { // * ๋ฐฉ๋ฌธํ์๊ฐ ๋์ด์๋ ์ธ๋ฑ์ค์ ์ซ์๋ค ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ max์ ์ ์ฅ
+ if (max < i) {
+ max = i;
+ }
+ }
+ }
+ }
+
+ // * ๋ฌธ์์ด๊ณผ i, j๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ฌธ์๋ฅผ ์๋ก ์ค์ํ๋ ํจ์
+ public static String swap(String s, int i, int j) {
+ char[] str = s.toCharArray();
+ char temp = str[i];
+ str[i] = str[j];
+ str[j] = temp;
+ return String.valueOf(str);
+ }
+
+
+}
diff --git a/java/BOJ/Gold/III/G3_11049.java b/java/BOJ/Gold/III/G3_11049.java
new file mode 100644
index 0000000..b8d4de8
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_11049.java
@@ -0,0 +1,107 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11049
+ *
+ * ? ์ ๋ชฉ: ํ๋ ฌ ๊ณฑ์
์์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ํฌ๊ธฐ๊ฐ NรM์ธ ํ๋ ฌ A์ MรK์ธ B๋ฅผ ๊ณฑํ ๋ ํ์ํ ๊ณฑ์
์ฐ์ฐ์ ์๋ ์ด NรMรK๋ฒ์ด๋ค. ํ๋ ฌ N๊ฐ๋ฅผ ๊ณฑํ๋๋ฐ ํ์ํ ๊ณฑ์
์ฐ์ฐ์ ์๋ ํ๋ ฌ์ ๊ณฑํ๋ ์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
+ * ์๋ฅผ ๋ค์ด, A์ ํฌ๊ธฐ๊ฐ 5ร3์ด๊ณ , B์ ํฌ๊ธฐ๊ฐ 3ร2, C์ ํฌ๊ธฐ๊ฐ 2ร6์ธ ๊ฒฝ์ฐ์ ํ๋ ฌ์ ๊ณฑ ABC๋ฅผ ๊ตฌํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
+ * AB๋ฅผ ๋จผ์ ๊ณฑํ๊ณ C๋ฅผ ๊ณฑํ๋ ๊ฒฝ์ฐ (AB)C์ ํ์ํ ๊ณฑ์
์ฐ์ฐ์ ์๋ 5ร3ร2 + 5ร2ร6 = 30 + 60 = 90๋ฒ์ด๋ค.
+ * BC๋ฅผ ๋จผ์ ๊ณฑํ๊ณ A๋ฅผ ๊ณฑํ๋ ๊ฒฝ์ฐ A(BC)์ ํ์ํ ๊ณฑ์
์ฐ์ฐ์ ์๋ 3ร2ร6 + 5ร3ร6 = 36 + 90 = 126๋ฒ์ด๋ค.
+ * ๊ฐ์ ๊ณฑ์
์ด์ง๋ง, ๊ณฑ์
์ ํ๋ ์์์ ๋ฐ๋ผ์ ๊ณฑ์
์ฐ์ฐ์ ์๊ฐ ๋ฌ๋ผ์ง๋ค.
+ * ํ๋ ฌ N๊ฐ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ํ๋ ฌ์ ๊ณฑํ๋๋ฐ ํ์ํ ๊ณฑ์
์ฐ์ฐ ํ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ํ๋ ฌ์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ์ ๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ๋ ฌ์ ๊ฐ์ N(1 โค N โค 500)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ํ๋ ฌ์ ํฌ๊ธฐ r๊ณผ c๊ฐ ์ฃผ์ด์ง๋ค. (1 โค r, c โค 500)
+ * ํญ์ ์์๋๋ก ๊ณฑ์
์ ํ ์ ์๋ ํฌ๊ธฐ๋ง ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 3 -> n
+ * 5 3 -> r c
+ * 3 2 -> r c
+ * 2 6 -> r c
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ํ๋ ฌ์ ๊ณฑํ๋๋ฐ ํ์ํ ๊ณฑ์
์ฐ์ฐ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ์ ๋ต์ 231-1 ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋ํ, ์ต์
์ ์์๋ก ์ฐ์ฐํด๋ ์ฐ์ฐ ํ์๊ฐ 231-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+ *
+ * 90
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.208์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 14MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G3_11049 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP Table ์ด๊ธฐํ
+ for (int[] d : dp) {
+ Arrays.fill(d, Integer.MAX_VALUE);
+ }
+
+ // * 3. Start Case ์ค์
+ for (int i = 0; i < n; i++) {
+ dp[i][i] = 0;
+ }
+
+ for (int i = 0; i < n-1; i++) {
+ dp[i][i+1] = arr[i][0] * arr[i][1] * arr[i+1][1];
+ }
+
+ // * 4. DP(Tabulation: Bottom-Up)
+ for (int k = 2; k < n; k++) {
+ for (int i = 0; i < n-2; i++) {
+ if (i + k >= n) {
+ continue;
+ }
+
+ for (int j = i; j < i + k; j++) {
+ dp[i][i+k] = Math.min(
+ dp[i][i+k],
+ dp[i][j] + dp[j+1][i+k] + arr[i][0] * arr[j][1] * arr[i+k][1]
+ );
+ }
+ }
+ }
+
+ // * 5. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(dp[0][n-1]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ dp = new int[n][n];
+
+ arr = new int[n][2];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ int r = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ arr[i][0] = r;
+ arr[i][1] = c;
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/III/G3_11066.java b/java/BOJ/Gold/III/G3_11066.java
new file mode 100644
index 0000000..c4bbe2d
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_11066.java
@@ -0,0 +1,92 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11066
+ *
+ * ? ์ ๋ชฉ: ํ์ผ ํฉ์น๊ธฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ค๊ฐ์ธ ๊น๋์ ์ ์์ค์ ์ฌ๋ฌ ์ฅ(chapter)์ผ๋ก ๋๋์ด ์ฐ๋๋ฐ, ๊ฐ ์ฅ์ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ผ์ ์ ์ฅํ๊ณค ํ๋ค. ์์ค์ ๋ชจ๋ ์ฅ์ ์ฐ๊ณ ๋์๋ ๊ฐ ์ฅ์ด ์ฐ์ฌ์ง ํ์ผ์ ํฉ์ณ์ ์ต์ข
์ ์ผ๋ก ์์ค์ ์์ฑ๋ณธ์ด ๋ค์ด์๋ ํ ๊ฐ์ ํ์ผ์ ๋ง๋ ๋ค. ์ด ๊ณผ์ ์์ ๋ ๊ฐ์ ํ์ผ์ ํฉ์ณ์ ํ๋์ ์์ํ์ผ์ ๋ง๋ค๊ณ , ์ด ์์ํ์ผ์ด๋ ์๋์ ํ์ผ์ ๊ณ์ ๋ ๊ฐ์ฉ ํฉ์ณ์ ์์ค์ ์ฌ๋ฌ ์ฅ๋ค์ด ์ฐ์์ด ๋๋๋ก ํ์ผ์ ํฉ์ณ๋๊ฐ๊ณ , ์ต์ข
์ ์ผ๋ก๋ ํ๋์ ํ์ผ๋ก ํฉ์น๋ค. ๋ ๊ฐ์ ํ์ผ์ ํฉ์น ๋ ํ์ํ ๋น์ฉ(์๊ฐ ๋ฑ)์ด ๋ ํ์ผ ํฌ๊ธฐ์ ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ ๋, ์ต์ข
์ ์ธ ํ ๊ฐ์ ํ์ผ์ ์์ฑํ๋๋ฐ ํ์ํ ๋น์ฉ์ ์ด ํฉ์ ๊ณ์ฐํ์์ค.
+ * ์๋ฅผ ๋ค์ด, C1, C2, C3, C4๊ฐ ์ฐ์์ ์ธ ๋ค ๊ฐ์ ์ฅ์ ์๋กํ๊ณ ์๋ ํ์ผ์ด๊ณ , ํ์ผ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฐ 40, 30, 30, 50 ์ด๋ผ๊ณ ํ์. ์ด ํ์ผ๋ค์ ํฉ์น๋ ๊ณผ์ ์์, ๋จผ์ C2์ C3๋ฅผ ํฉ์ณ์ ์์ํ์ผ X1์ ๋ง๋ ๋ค. ์ด๋ ๋น์ฉ 60์ด ํ์ํ๋ค. ๊ทธ ๋ค์์ผ๋ก C1๊ณผ X1์ ํฉ์ณ ์์ํ์ผ X2๋ฅผ ๋ง๋ค๋ฉด ๋น์ฉ 100์ด ํ์ํ๋ค. ์ต์ข
์ ์ผ๋ก X2์ C4๋ฅผ ํฉ์ณ ์ต์ข
ํ์ผ์ ๋ง๋ค๋ฉด ๋น์ฉ 150์ด ํ์ํ๋ค. ๋ฐ๋ผ์, ์ต์ข
์ ํ ํ์ผ์ ๋ง๋๋๋ฐ ํ์ํ ๋น์ฉ์ ํฉ์ 60+100+150=310 ์ด๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ผ์ ํฉ์น๋ฉด ๋น์ฉ์ ์ค์ผ ์ ์๋ค. ๋จผ์ C1๊ณผ C2๋ฅผ ํฉ์ณ ์์ํ์ผ Y1์ ๋ง๋ค๊ณ , C3์ C4๋ฅผ ํฉ์ณ ์์ํ์ผ Y2๋ฅผ ๋ง๋ค๊ณ , ์ต์ข
์ ์ผ๋ก Y1๊ณผ Y2๋ฅผ ํฉ์ณ ์ต์ข
ํ์ผ์ ๋ง๋ค ์ ์๋ค. ์ด๋ ํ์ํ ์ด ๋น์ฉ์ 70+80+150=300 ์ด๋ค.
+ * ์์ค์ ๊ฐ ์ฅ๋ค์ด ์๋ก๋์ด ์๋ ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ํ์ผ๋ค์ ํ๋์ ํ์ผ๋ก ํฉ์น ๋ ํ์ํ ์ต์๋น์ฉ์ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ํ๋ก๊ทธ๋จ์ ํ์ค ์
๋ ฅ์์ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค. ํ๋ก๊ทธ๋จ์ ์
๋ ฅ์ T๊ฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, T๋ ์
๋ ฅ์ ๋งจ ์ฒซ ์ค์ ์ฃผ์ด์ง๋ค.๊ฐ ํ
์คํธ ๋ฐ์ดํฐ๋ ๋ ๊ฐ์ ํ์ผ๋ก ์ฃผ์ด์ง๋๋ฐ, ์ฒซ ํ์๋ ์์ค์ ๊ตฌ์ฑํ๋ ์ฅ์ ์๋ฅผ ๋ํ๋ด๋ ์์ ์ ์ K (3 โค K โค 500)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ํ์๋ 1์ฅ๋ถํฐ K์ฅ๊น์ง ์๋กํ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์์ ์ ์ K๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. ํ์ผ์ ํฌ๊ธฐ๋ 10,000์ ์ด๊ณผํ์ง ์๋๋ค.
+ *
+ * 2 -> t
+ * 4 -> n
+ * 40 30 30 50 -> arr[1] ~ arr[n]
+ * 15 -> n
+ * 1 21 3 4 5 35 5 4 3 5 98 21 14 17 32 -> arr[1] ~ arr[n]
+ *
+ * ? ์ถ๋ ฅ
+ * ํ๋ก๊ทธ๋จ์ ํ์ค ์ถ๋ ฅ์ ์ถ๋ ฅํ๋ค. ๊ฐ ํ
์คํธ ๋ฐ์ดํฐ๋ง๋ค ์ ํํ ํ ํ์ ์ถ๋ ฅํ๋๋ฐ, ๋ชจ๋ ์ฅ์ ํฉ์น๋๋ฐ ํ์ํ ์ต์๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 300
+ * 864
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.32์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 18MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G3_11066 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr, sum;
+
+ // * DP Table
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine()); // Test Case ๊ฐ์
+ for (int i = 0; i < t; i++) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bw.write(mergeFile() + "\n"); // * 2. DP(Tabulation: Bottom-Up) + 3. ์ถ๋ ฅ
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1];
+ sum = new int[n+1];
+ dp = new int[n+1][n+1];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 1; i <= n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ sum[i] = sum[i-1] + arr[i];
+ }
+ }
+
+ // * DP
+ public static int mergeFile() {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; i+j <= n; j++) {
+ dp[j][i+j] = Integer.MAX_VALUE;
+ for (int k = j; k < i+j; k++) {
+ dp[j][i+j] = Math.min(dp[j][i+j], dp[j][k] + dp[k+1][i+j] + sum[i+j] - sum[j-1]);
+ }
+ }
+ }
+
+ return dp[1][n];
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_11066_RECURSE.java b/java/BOJ/Gold/III/G3_11066_RECURSE.java
new file mode 100644
index 0000000..a00190a
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_11066_RECURSE.java
@@ -0,0 +1,104 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11066
+ *
+ * ? ์ ๋ชฉ: ํ์ผ ํฉ์น๊ธฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ค๊ฐ์ธ ๊น๋์ ์ ์์ค์ ์ฌ๋ฌ ์ฅ(chapter)์ผ๋ก ๋๋์ด ์ฐ๋๋ฐ, ๊ฐ ์ฅ์ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ผ์ ์ ์ฅํ๊ณค ํ๋ค. ์์ค์ ๋ชจ๋ ์ฅ์ ์ฐ๊ณ ๋์๋ ๊ฐ ์ฅ์ด ์ฐ์ฌ์ง ํ์ผ์ ํฉ์ณ์ ์ต์ข
์ ์ผ๋ก ์์ค์ ์์ฑ๋ณธ์ด ๋ค์ด์๋ ํ ๊ฐ์ ํ์ผ์ ๋ง๋ ๋ค. ์ด ๊ณผ์ ์์ ๋ ๊ฐ์ ํ์ผ์ ํฉ์ณ์ ํ๋์ ์์ํ์ผ์ ๋ง๋ค๊ณ , ์ด ์์ํ์ผ์ด๋ ์๋์ ํ์ผ์ ๊ณ์ ๋ ๊ฐ์ฉ ํฉ์ณ์ ์์ค์ ์ฌ๋ฌ ์ฅ๋ค์ด ์ฐ์์ด ๋๋๋ก ํ์ผ์ ํฉ์ณ๋๊ฐ๊ณ , ์ต์ข
์ ์ผ๋ก๋ ํ๋์ ํ์ผ๋ก ํฉ์น๋ค. ๋ ๊ฐ์ ํ์ผ์ ํฉ์น ๋ ํ์ํ ๋น์ฉ(์๊ฐ ๋ฑ)์ด ๋ ํ์ผ ํฌ๊ธฐ์ ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ ๋, ์ต์ข
์ ์ธ ํ ๊ฐ์ ํ์ผ์ ์์ฑํ๋๋ฐ ํ์ํ ๋น์ฉ์ ์ด ํฉ์ ๊ณ์ฐํ์์ค.
+ * ์๋ฅผ ๋ค์ด, C1, C2, C3, C4๊ฐ ์ฐ์์ ์ธ ๋ค ๊ฐ์ ์ฅ์ ์๋กํ๊ณ ์๋ ํ์ผ์ด๊ณ , ํ์ผ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฐ 40, 30, 30, 50 ์ด๋ผ๊ณ ํ์. ์ด ํ์ผ๋ค์ ํฉ์น๋ ๊ณผ์ ์์, ๋จผ์ C2์ C3๋ฅผ ํฉ์ณ์ ์์ํ์ผ X1์ ๋ง๋ ๋ค. ์ด๋ ๋น์ฉ 60์ด ํ์ํ๋ค. ๊ทธ ๋ค์์ผ๋ก C1๊ณผ X1์ ํฉ์ณ ์์ํ์ผ X2๋ฅผ ๋ง๋ค๋ฉด ๋น์ฉ 100์ด ํ์ํ๋ค. ์ต์ข
์ ์ผ๋ก X2์ C4๋ฅผ ํฉ์ณ ์ต์ข
ํ์ผ์ ๋ง๋ค๋ฉด ๋น์ฉ 150์ด ํ์ํ๋ค. ๋ฐ๋ผ์, ์ต์ข
์ ํ ํ์ผ์ ๋ง๋๋๋ฐ ํ์ํ ๋น์ฉ์ ํฉ์ 60+100+150=310 ์ด๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ผ์ ํฉ์น๋ฉด ๋น์ฉ์ ์ค์ผ ์ ์๋ค. ๋จผ์ C1๊ณผ C2๋ฅผ ํฉ์ณ ์์ํ์ผ Y1์ ๋ง๋ค๊ณ , C3์ C4๋ฅผ ํฉ์ณ ์์ํ์ผ Y2๋ฅผ ๋ง๋ค๊ณ , ์ต์ข
์ ์ผ๋ก Y1๊ณผ Y2๋ฅผ ํฉ์ณ ์ต์ข
ํ์ผ์ ๋ง๋ค ์ ์๋ค. ์ด๋ ํ์ํ ์ด ๋น์ฉ์ 70+80+150=300 ์ด๋ค.
+ * ์์ค์ ๊ฐ ์ฅ๋ค์ด ์๋ก๋์ด ์๋ ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ํ์ผ๋ค์ ํ๋์ ํ์ผ๋ก ํฉ์น ๋ ํ์ํ ์ต์๋น์ฉ์ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ํ๋ก๊ทธ๋จ์ ํ์ค ์
๋ ฅ์์ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค. ํ๋ก๊ทธ๋จ์ ์
๋ ฅ์ T๊ฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, T๋ ์
๋ ฅ์ ๋งจ ์ฒซ ์ค์ ์ฃผ์ด์ง๋ค.๊ฐ ํ
์คํธ ๋ฐ์ดํฐ๋ ๋ ๊ฐ์ ํ์ผ๋ก ์ฃผ์ด์ง๋๋ฐ, ์ฒซ ํ์๋ ์์ค์ ๊ตฌ์ฑํ๋ ์ฅ์ ์๋ฅผ ๋ํ๋ด๋ ์์ ์ ์ K (3 โค K โค 500)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ํ์๋ 1์ฅ๋ถํฐ K์ฅ๊น์ง ์๋กํ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์์ ์ ์ K๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. ํ์ผ์ ํฌ๊ธฐ๋ 10,000์ ์ด๊ณผํ์ง ์๋๋ค.
+ *
+ * 2 -> t
+ * 4 -> n
+ * 40 30 30 50 -> arr[1] ~ arr[n]
+ * 15 -> n
+ * 1 21 3 4 5 35 5 4 3 5 98 21 14 17 32 -> arr[1] ~ arr[n]
+ *
+ * ? ์ถ๋ ฅ
+ * ํ๋ก๊ทธ๋จ์ ํ์ค ์ถ๋ ฅ์ ์ถ๋ ฅํ๋ค. ๊ฐ ํ
์คํธ ๋ฐ์ดํฐ๋ง๋ค ์ ํํ ํ ํ์ ์ถ๋ ฅํ๋๋ฐ, ๋ชจ๋ ์ฅ์ ํฉ์น๋๋ฐ ํ์ํ ์ต์๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 300
+ * 864
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.68์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 20MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G3_11066_RECURSE {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr, sum;
+
+ // * DP Table
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine()); // Test Case ๊ฐ์
+ for (int i = 0; i < t; i++) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bw.write(mergeFile(1, n) - sum[n] + "\n"); // * 2. DP(Memoization: Top-Down) + 3. ์ถ๋ ฅ
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1];
+ sum = new int[n+1];
+ dp = new int[n+1][n+1];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 1; i <= n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ sum[i] = sum[i-1] + arr[i];
+ }
+
+ for (int[] d : dp) {
+ Arrays.fill(d, -1);
+ }
+ }
+
+ // * DP
+ public static int mergeFile(int start, int end) {
+ if (start == end) {
+ return arr[start];
+ }
+
+ if (dp[start][end] != -1) {
+ return dp[start][end];
+ }
+
+ dp[start][end] = 1_000_000_000;
+
+ for (int i = start; i < end; i++) {
+ dp[start][end] = Math.min(dp[start][end], mergeFile(start, i) + mergeFile(i+1, end));
+ }
+
+ dp[start][end] += sum[end] - sum[start-1];
+
+ return dp[start][end];
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_11085.java b/java/BOJ/Gold/III/G3_11085.java
new file mode 100644
index 0000000..fa6548a
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_11085.java
@@ -0,0 +1,116 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11085
+ *
+ * ? ์ ๋ชฉ: ๊ตฐ์ฌ ์ด๋
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ ์ ๋น์ Baekjoon World์ ๊ตญ์์ Cube World๋ฅผ ๊ณต๊ฒฉํ ์์ ์ ์ธ์ด ์ ์ด ์์ต๋๋ค. Baekjoon World์ Cube World๋ p๊ฐ์ ์ง์ ๊ณผ w๊ฐ์ ๊ธธ๋ก ํํ๋ฉ๋๋ค. ๋ชจ๋ ๊ธธ์ ์๋ฐฉํฅ์ด๋ฉฐ, ๊ฐ ๊ธธ๋ง๋ค ๋๋น๊ฐ ์กด์ฌํ์ฌ ์ด์ ๋น๋กํ๋ ์์ ๊ตฐ์ฌ๊ฐ ์ง๋๊ฐ ์ ์์ต๋๋ค.
+ * Baekjoon World์ ๊ตญ์์ ๊ตฐ์ฌ๋ค์ด ๋ญ์น๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค๊ณ ์๊ฐํด์, ๋ฏธ๋ฆฌ Cube World๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ์ ํด ๋๊ณ ๊ทธ ๊ฒฝ๋ก๋ก๋ง ๋ชจ๋ ๊ตฐ์ฌ๋ฅผ ๋ณด๋์ต๋๋ค. Baekjoon World์ ๊ตญ์์ ์ด๋ช
ํด์, ๊ฒฝ๋ก ์์ ์๋ ๊ธธ ์ค ๋๋น๊ฐ ๊ฐ์ฅ ์ข์ ๊ธธ์ ๋๋น๋ฅผ ์ต๋ํํ๋ ๊ฒฝ๋ก๋ฅผ ํํ์ต๋๋ค.
+ * ๊ทธ๋ฐ๋ฐ ์ ์ ๋๋ฌธ์ ์ด๋ ๊ธธ๋ก ๋ณด๋๋์ง์ ๋ํ ๊ธฐ๋ก์ด ๋ถํ ์์ด์ ธ ๋ฒ๋ ธ์ต๋๋ค. ์ ์์ฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด ๊ธฐ๋ก์ด ๊ผญ ํ์ํฉ๋๋ค. ์๋ํ ๊ณผํ์์ธ ๋น์ ์ด ๋ค์ ๋ณต๊ตฌํด ์ฃผ์ธ์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ์ค์ p์ w๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค. (2 โค p โค 1 000; 1 โค w โค 50 000)
+ * ๋ค์ ์ค์ Baekjoon World์ ์๋ c์ Cube World์ ์๋ v๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค. (0 โค c, v < p; c โ v)
+ * ๋ค์ w์ค์ ๊ธธ์ด ์ฐ๊ฒฐํ๋ ๋ ์ง์ wstart, wend,์ ๊ธธ์ ๋๋น wwidth๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค. (0 โค wstart, wend < p; wstart โ wend; 1 โค wwidth โค 1 000)
+ *
+ * 7 11 -> n m
+ * 3 5 -> s e
+ * 0 1 15 -> a b c
+ * 0 2 23 -> a b c
+ * 1 2 16 -> a b c
+ * 1 3 27 -> a b c
+ * 2 4 3 -> a b c
+ * 2 6 21 -> a b c
+ * 3 4 14 -> a b c
+ * 3 5 10 -> a b c
+ * 4 5 50 -> a b c
+ * 4 6 9 -> a b c
+ * 5 6 42 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ์ค์ Baekjoon World์ ๊ตญ์์ด ์ ํ ๊ฒฝ๋ก ์์ ์๋ ๊ธธ ์ค ๋๋น๊ฐ ๊ฐ์ฅ ์ข์ ๊ธธ์ ๋๋น๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
+ *
+ * 16
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.468์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 36MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+
+public class G3_11085 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int p, w, s, e;
+ static int[] visit;
+ static ArrayList[] list;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ dijkstra();
+ System.out.println(visit[e]);
+ }
+
+ public static void dijkstra() {
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> b[1] - a[1]);
+ pq.add(new int[]{s, 1000});
+ visit[s] = 1000;
+
+ while (!pq.isEmpty()) {
+ int[] cur = pq.poll();
+
+ if (visit[cur[0]] > cur[1]) {
+ continue;
+ }
+
+ for (int[] next : list[cur[0]]) {
+ int minWidth = Math.min(cur[1], next[1]);
+
+ if (visit[next[0]] < minWidth) {
+ visit[next[0]] = minWidth;
+ pq.add(new int[]{next[0], minWidth});
+ }
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ p = Integer.parseInt(st.nextToken());
+ w = Integer.parseInt(st.nextToken());
+
+ st = new StringTokenizer(br.readLine());
+ s = Integer.parseInt(st.nextToken());
+ e = Integer.parseInt(st.nextToken());
+
+ visit = new int[p];
+ Arrays.fill(visit, -1);
+ list = new ArrayList[p];
+ for (int i = 0; i < p; i++) {
+ list[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < w; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+ list[a].add(new int[]{b, c});
+ list[b].add(new int[]{a, c});
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_11437.java b/java/BOJ/Gold/III/G3_11437.java
new file mode 100644
index 0000000..f5c2b3e
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_11437.java
@@ -0,0 +1,89 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11437
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.*;
+
+public class G3_11437 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int[] parent;
+ static int n, m;
+ static StringBuffer sb = new StringBuffer();
+
+ public static void main(String[] args) throws IOException {
+ n = Integer.parseInt(br.readLine());
+ parent = new int[n+1];
+ parent[1] = 1;
+ ArrayList[] adj = new ArrayList[n+1];
+
+ for (int i = 0; i < n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ if (adj[a] == null) {
+ adj[a] = new ArrayList<>();
+ }
+ if (adj[b] == null) {
+ adj[b] = new ArrayList<>();
+ }
+ adj[a].add(b);
+ adj[b].add(a);
+ }
+
+ Queue queue = new LinkedList<>();
+ queue.add(1);
+
+ while (!queue.isEmpty()) {
+ int cur = queue.poll();
+
+ for (int child : adj[cur]) {
+ if (parent[child] == 0) {
+ parent[child] = cur;
+ queue.add(child);
+ }
+ }
+ }
+
+ m = Integer.parseInt(br.readLine());
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ findParent(a, b);
+ }
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void findParent(int a, int b) {
+ int ap = a;
+ Set set = new HashSet<>();
+ while (ap > 1) {
+ set.add(ap);
+ ap = parent[ap];
+ }
+ set.add(1);
+
+ int bp = b;
+ while (bp > 1) {
+ if (set.contains(bp)) {
+ sb.append(bp + "\n");
+ return;
+ }
+ bp = parent[bp];
+ }
+ if (bp == 1) {
+ sb.append(1 + "\n");
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_11562.java b/java/BOJ/Gold/III/G3_11562.java
new file mode 100644
index 0000000..b49e09f
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_11562.java
@@ -0,0 +1,149 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11562
+ *
+ * ? ์ ๋ชฉ: ๋ฐฑ์๋ก ๋ธ๋ ์ดํฌ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ธ ์์ฌ Y๋ชจ ๋ํ๊ต์์ ๋๊ท๋ชจ ๊ณต์ฌ๋ฅผ ์งํํ๋ฉด์, ํ๊ต๊ฐ ๋ง์น ๋ฏธ๋ก์ฒ๋ผ ๋ณํด๋ฒ๋ฆฌ๊ณ ๋ง์๋ค. ๊ณต์ฌ ์ด์ ๊น์ง๋ ์ด๋ค ๊ฑด๋ฌผ์์ ์ถ๋ฐํ๋๋ผ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฑด๋ฌผ๋ก ๊ฐ ์ ์๋ ๊ธธ์ด ์์์ผ๋, ๊ณต์ฌ๊ฐ ์งํ๋๋ฉด์ ์ด๋ป๊ฒ ํ ๊ฑด์ง ์ ์ ์์ง๋ง ์ผ๋ฐฉํตํ๋ง ๊ฐ๋ฅํ ๊ธธ์ด ๋ง์ด ๋๊ณ ๋ง์๋ค.
+ * ์ปดํจํฐ๊ณผํ๊ณผ ํ์ ๋จ๊ท๋ ์ ๊ณต ์์
์ ๋ฃ๊ณ ๊ต์ ์์
์ ๋ค์ผ๋ฌ ๊ฐ๋ ์ค ๊ธธ์ ์์ด 3์ผ ๋ฐค๋ฎ์ ํค๋งค๋ค๊ฐ ๊ณตํ๊ด์์ ์ข
ํฉ๊ด์ผ๋ก ๊ฐ๋ ๊ธธ์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ๋ค.
+ * 3์ผ ์ฌ์ด์ ๊ณผ์ ๋ ๋ด์ง ๋ชปํ๊ณ ์ถ์๋ ํ์ง ๋ชปํด ํ์ฌ๊ฒฝ๊ณ ์๊ธฐ์ ์ฒํ ๋จ๊ท๋ ์ ๊ณต์ ์ด๋ ค ํ์ฌ ์ผ๋ฐฉํตํ์ธ ๊ธธ๋ค ์ค ๋ฐ๋์ ์๋ฐฉํฅ์ผ๋ก ๋ฐ๊ฟ์ผ๋ง ํ๋ ๊ธธ์ด ๋ช ๊ฐ์ธ์ง ์กฐ์ฌํด ํ๊ต์ ๊ฑด์ํ๊ธฐ๋ก ๋ง์์ ๋จน์๋ค.
+ * ๋จ๊ท๋ ์ฌ๋ฌ ๊ฑด๋ฌผ๋ค ์ฌ์ด๋ฅผ ์ง์ ์๋ ๊ธธ๋ค์ ๋ชจ๋ ์กฐ์ฌํ๊ณ , ๊ทธ ์ค ์ด๋ค ๊ธธ๋ค์ด ์ผ๋ฐฉํตํ์ธ์ง, ๋๋ ์๋ฐฉํฅ ํตํ์ด ๊ฐ๋ฅํ์ง๋ฅผ ๋ชจ๋ ์ฒดํฌํ๋ค.
+ * ๋จ๊ท์ ํ๋ก๊ทธ๋จ์ ๊ฐ๋จํ๋ค. ์ถ๋ฐ์ง์ ๋์ฐฉ์ง๋ฅผ ์
๋ ฅํ๋ฉด ๋์ฐฉ์ง๊น์ง ๊ฐ๊ธฐ ์ํด ์ต์ ๋ช ๊ฐ์ ๊ธธ์ ์๋ฐฉํฅ์ผ๋ก ๋ฐ๊ฟ์ผ๋ง ํ๋์ง๋ฅผ ์ถ๋ ฅํด์ค๋ค. ํ๋ก๊ทธ๋จ์ด ์์ฑ๋์๋ค๋ ์๋ฌธ์ด ํผ์ง์, ๋จ๊ท์ฒ๋ผ ๊ธธ์ ์๊ณ ํค๋งจ ๊ฒฝํ์ด ์๋ ํ์๋ค์ ๋จ๊ท์๊ฒ ๋ฌป๊ธฐ ์์ํ๋ค.
+ * "๊ณตํ๊ด์์ ๋๊ฐ๋น ๊ฐ ์ ์์ด?"
+ * "์๊ฒฝ๋ ๋ณ๊ด์์ ํ๊ด์ผ๋ก๋?"
+ * ๋จ๊ท๋ ๋งค๋ฒ ์์ผ๋ก ํ์ดํํด ์
๋ ฅํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ด์ฃผ๋ ๋ฐ์ ์ง์น๊ณ ๋ง์๋ค.
+ * ๊ฒฐ๊ตญ ์์๋์ด ๋จ๊ท๋ฅผ ์ํด ํ์๋ค์ ์ง๋ฌธ์ ํด๊ฒฐํ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ ์ค์ Y๋ํ๊ต ๊ฑด๋ฌผ์ ์ n๊ณผ ๊ธธ์ ์ m์ด ์ฃผ์ด์ง๋ค. (n โค 250, m โค n * (n - 1) / 2 )
+ * ๋ค์ m์ค์ ๊ฑธ์ณ, u v b (1 โค u โค n, 1 โค v โค n, u != v, b = 0 ๋๋ 1) ์ ํํ๋ก ๊ธธ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
+ * b๊ฐ 0์ผ ๊ฒฝ์ฐ u์์ v๋ก ๊ฐ๋ ์ผ๋ฐฉํตํ ๊ธธ์ธ ๊ฒ์ด๊ณ , b๊ฐ 1์ผ ๊ฒฝ์ฐ u์ v๋ฅผ ์๋ ์๋ฐฉํฅ ๊ธธ์ด๋ค.
+ * ์ด๋ค ๋ ๊ฑด๋ฌผ ์ฌ์ด๋ฅผ ์๋ ๊ธธ์ ์ต๋ ํ ๊ฐ์ด๋ค.
+ * ๋ค์ ์ค์ ํ์๋ค์ ์ง๋ฌธ์ ์ k๊ฐ ์ฃผ์ด์ง๋ค. (1 โค k โค 30,000)
+ * ๋ค์ k์ค์ ๊ฑธ์ณ s e (1 โค s โค n, 1 โค e โค n)์ ํํ๋ก ํ์๋ค์ ์ง๋ฌธ๋ค์ด ์ฃผ์ด์ง๋ค.
+ * ์ด๋ ์ง๋ฌธํ ํ์์ด ๊ฑด๋ฌผ s์์ ๊ฑด๋ฌผ e๋ก ๊ฐ๊ณ ์ถ๋ค๋ ์๋ฏธ์ด๋ค.
+ *
+ * 4 3 -> n m
+ * 1 2 0 -> u v b
+ * 2 3 1 -> u v b
+ * 3 4 0 -> u v b
+ * 7 -> k
+ * 1 1 -> s e
+ * 1 2 -> s e
+ * 2 1 -> s e
+ * 1 4 -> s e
+ * 4 1 -> s e
+ * 2 3 -> s e
+ * 4 3 -> s e
+ *
+ * ? ์ถ๋ ฅ
+ * ์ถ๋ ฅ์ k์ค์ ๊ฑธ์ณ ์ด๋ฃจ์ด์ง๋ค.
+ * ๊ฐ ์ง๋ฌธ์ ๋ํด, ์ต์ ๋ช ๊ฐ์ ์ผ๋ฐฉํตํ์ธ ๊ธธ์ ์๋ฐฉํฅ ํตํ์ผ๋ก ๋ฐ๊ฟ์ผ ์ถ๋ฐ์ง์์ ๋์ฐฉ์ง๋ก ๊ฐ ์ ์๋์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ๋ชจ๋ ๊ธธ์ ์๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ๋๋ผ๋ ์๋ก ๋๋ฌ ๋ถ๊ฐ๋ฅํ ๊ฑด๋ฌผ์ ์๋ค.
+ *
+ * 0
+ * 0
+ * 1
+ * 0
+ * 2
+ * 0
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.392์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 34MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class G3_11562 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int MAX = 100_000;
+
+ static int n, m, k;
+ static int[][] floyd;
+ static ArrayList questions;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ floydWarshall();
+
+ StringBuffer sb = new StringBuffer();
+ for (int[] question : questions) {
+ sb.append(floyd[question[0]][question[1]] + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void floydWarshall() {
+ for (int t = 1; t <= n; t++) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (t == i || i == j) {
+ continue;
+ }
+
+ if (floyd[i][j] > floyd[i][t] + floyd[t][j]) {
+ floyd[i][j] = floyd[i][t] + floyd[t][j];
+ }
+ }
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ floyd = new int[n+1][n+1];
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (i == j) {
+ continue;
+ }
+
+ floyd[i][j] = MAX;
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int u = Integer.parseInt(st.nextToken());
+ int v = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ floyd[u][v] = 0;
+ if (b == 0) {
+ floyd[v][u] = 1;
+ } else {
+ floyd[v][u] = 0;
+ }
+ }
+
+ questions = new ArrayList<>();
+ k = Integer.parseInt(br.readLine());
+ for (int i = 0; i < k; i++) {
+ st = new StringTokenizer(br.readLine());
+ int s = Integer.parseInt(st.nextToken());
+ int e = Integer.parseInt(st.nextToken());
+ questions.add(new int[] {s, e});
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_13418.java b/java/BOJ/Gold/III/G3_13418.java
new file mode 100644
index 0000000..d2b7182
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_13418.java
@@ -0,0 +1,130 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/13418
+ *
+ * ? ์ ๋ชฉ: ํ๊ต ํ๋ฐฉํ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๊ตญ๋ฏผ๋ํ๊ต ํ๋ณด๋์ฌ ๊ตญํฌ๋ ์ฌ๋ฆ๋ฐฉํ์ ๋ง์ ๊ณ ๋ฑํ์๋ค์ ๋์์ผ๋ก ํ๊ต ๋ด๋ถ์ ์๋ ๊ฑด๋ฌผ์ ์๊ฐํด์ฃผ๋ ์ผ์ ํ๊ฒ ๋์ด ํ๊ต ๊ฑด๋ฌผ์ ์ฐจ๋ก๋ก ์๊ฐํ ์ ์๋ ์ด๋ ๊ฒฝ๋ก๋ฅผ ์ง๋ณด๊ธฐ๋ก ํ์๋ค. ๊ตญ๋ฏผ๋ํ๊ต๋ ๋ถํ์ฐ์ ์ ๊ธฐ๋ฅผ ๋ฐ๋ ์์น์ ์์ด ๊ฑด๋ฌผ ๊ฐ ์ฐ๊ฒฐ๋ ๊ธธ์ด ํ๋ํ ์ค๋ฅด๋ง๊ธธ์ผ ์๋ ์๊ณ , ๋ด๋ฆฌ๋ง๊ธธ์ผ ์๋ ์๋ค. ๊ตญํฌ๋ ๋จผ์ ์
๊ตฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฑด๋ฌผ ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ก๊ฐ ์ค๋ฅด๋ง๊ธธ์ธ์ง, ๋ด๋ฆฌ๋ง๊ธธ์ธ์ง๋ฅผ ํ์
ํ์ฌ ์ค๋ฅด๋ง๊ธธ์ธ ๊ฒฝ์ฐ ์ ์ , ๋ด๋ฆฌ๋ง๊ธธ์ธ ๊ฒฝ์ฐ ์ค์ ์ผ๋ก ํ์ํ์๋ค.
+ * ๊ฑด๋ฌผ์ ๊ตฌ๋ถํ๊ธฐ ์ฝ๋๋ก ๋ฒํธ๋ฅผ ๋ถ์๊ณ , ์
๊ตฌ์๋ ์ซ์ 0์ ๋ถ์ด๊ธฐ๋ก ํ์๋ค. ๊ทธ ๋ค์ ๋ชจ๋ ๊ฑด๋ฌผ์ ๋ฐฉ๋ฌธํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ๊ธธ์ ์ ํํ์ฌ, ํด๋น ๊ธธ์ ํตํด์๋ง ๊ฑด๋ฌผ๋ค์ ์๊ฐํ๊ธฐ๋ก ํ์๋ค. ์ด ๊ณผ์ ์ ๊ต์ฅํ ์ ์คํด์ผ ํ๋๋ฐ, ์ค๋ฅด๋ง๊ธธ์ด ๋ง์ด ํฌํจ๋๊ฒ ๋๋ฉด ๊ต์ฅํ ํผ๊ณคํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
+ * ์ผ๋ง๋ ํผ๊ณคํด์ง๋์ง ์์๋ณด๊ธฐ ์ํด ํผ๋ก๋๋ฅผ ๊ณ์ฐํ๊ธฐ๋ก ํ์๋ค. ์ค๋ฅด๋ง๊ธธ์ k๋ฒ ์ค๋ฅผ ๋, ํผ๋ก๋๋ k2์ด ๋๋ค. ํผ๋ก๋์ ๊ณ์ฐ์ ์ต์ด ์กฐ์ฌ๋ ๊ธธ์ ๊ธฐ์ค์ผ๋ก๋ง ํ๋ค. ์ฆ, ๋ด๋ฆฌ๋ง๊ธธ๋ก ๋ด๋ ค๊ฐ๋ค ๋ค์ ์ฌ๋ผ์ฌ ๋ ์ค๋ฅด๋ง๊ธธ์ด ๋๋ ๊ฒฝ์ฐ๋ ๊ณ ๋ คํ์ง ์๋๋ค. ์
๊ตฌ๋ ํญ์ 1๋ฒ ๊ฑด๋ฌผ๊ณผ ์ฐ๊ฒฐ๋ ๋๋ก๋ฅผ ๊ฐ์ง๋ฉฐ, ์ถ๋ฐ์ ํญ์ ์
๊ตฌ์์ ํ๋ค.
+ * ๊ทธ๋ฆผ 1์์ ๋ชจ๋ ๊ฑด๋ฌผ์ ์๊ฐํ๊ธฐ ์ํด ๊ฑฐ์ณ์ผ ํ ์ต์ํ์ ๋๋ก๋ 4๊ฐ์์ ์ ์ ์๋ค. ๋ค์ 2๊ฐ์ ๊ทธ๋ฆผ์ ๊ทธ 4๊ฐ์ ๋๋ก๋ฅผ ๋ฝ์ ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค. ๊ทธ๋ฆผ 2๋ ํ๊ต๋ฅผ ์๊ฐํ๋ ๋ฐ ์ด 3๊ฐ์ ์ค๋ฅด๋ง๊ธธ์ ์ค๋ฅด๊ฒ ๋๋ฉฐ ํผ๋ก๋๊ฐ 9๊ฐ ๋๋ ์ต์
์ ์ฝ์ค๊ฐ ๋๋ค. ๊ทธ๋ฆผ 3์ ์ค๋ฅด๋ง๊ธธ์ 1๋ฒ๋ง ์ค๋ฅด๊ฒ ๋๋ฏ๋ก ํ์๋ค์ ํผ๋ก๋๋ 1์ด ๋๋ ์ต์ ์ ์ฝ์ค๊ฐ ๋๋ค. ์ด ๊ฒฝ์ฐ ์ต์
์ ์ฝ์ค์ ์ต์ ์ ์ฝ์ค๊ฐ ์ต์ข
ํผ๋ก๋์ ์ฐจ์ด๋ 8์ด ๋๋ค. ๊ตญํฌ๋ ์ต๊ณ ์ ํ๋ก๊ทธ๋๋จธ์ธ ๋น์ ์๊ฒ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ต์
, ์ต์ ์ ๊ฒฝ๋ก ๊ฐ ํผ๋ก๋์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์ ์์ ๋ถํํ์๋ค. ํ๋ก๊ทธ๋จ์ ์์ฑํ์ฌ ๊ตญํฌ๋ฅผ ๋์์ฃผ์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ ๋ฐ์ดํฐ๋ ํ์ค ์
๋ ฅ์ ์ฌ์ฉํ๋ค. ์
๋ ฅ์ 1๊ฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋ค. ์
๋ ฅ์ ์ฒซ ๋ฒ์งธ ์ค์๋ ๊ฑด๋ฌผ์ ๊ฐ์ N(1 โค N โค 1,000)๊ณผ ๋๋ก์ ๊ฐ์ M(1 โค M โค N(N-1)/2) ์ด ์ฃผ์ด์ง๋ค. ์
๋ ฅ์ ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๊ฐ์ ์ค์๋ A, B(1 โค A, B โค N), C ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A์ B ๊ฑด๋ฌผ์ ์ฐ๊ฒฐ๋ ๋๋ก๊ฐ ์๋ค๋ ๋ป์ด๋ฉฐ, C๋ 0(์ค๋ฅด๋ง๊ธธ) ๋๋ 1(๋ด๋ฆฌ๋ง๊ธธ)์ ๊ฐ์ ๊ฐ์ง๋ค. ๊ฐ์ ๊ฒฝ๋ก ์์ 2๊ฐ ์ด์์ ๋๋ก๊ฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฉฐ, ์
๊ตฌ๋ ํญ์ 1๋ฒ ๊ฑด๋ฌผ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค. ์
๊ตฌ์ 1๋ฒ ๋๋ก ๊ฐ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ ํญ์ 2๋ฒ์งธ ์ค์ ์ฃผ์ด์ง๋ค. ์
๊ตฌ์์ ๋ชจ๋ ๊ฑด๋ฌผ๋ก ๊ฐ ์ ์์์ด ๋ณด์ฅ๋๋ค.
+ *
+ * 4 5 -> n m
+ * 0 1 1 -> a b c
+ * 1 2 0 -> a b c
+ * 1 4 0 -> a b c
+ * 4 2 1 -> a b c
+ * 3 4 1 -> a b c
+ * 2 3 0 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ์ถ๋ ฅ์ ํ์ค ์ถ๋ ฅ์ ์ฌ์ฉํ๋ค. ์
๋ ฅ๋ฐ์ ๋ฐ์ดํฐ์ ๋ํด, ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต์
์ ๊ฒฝ๋ก์์์ ํผ๋ก๋์ ์ต์ ์ ๊ฒฝ๋ก ๊ฐ ํผ๋ก๋์ ์ฐจ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 8
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.864์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 170MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G3_13418 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m;
+ static boolean firstUp;
+ static int[] parent;
+ static ArrayList list;
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ list.sort((a, b) -> b[2] - a[2]);
+ int k1 = kruskal();
+
+ list.sort((a, b) -> a[2] - b[2]);
+ int k2 = kruskal();
+
+ System.out.println(k2 - k1);
+ }
+
+ public static int kruskal() {
+ int k = 0;
+ int count = 0;
+ parent = IntStream.range(0, n + 1).toArray();
+ parent[1] = 0;
+
+ for (int i = 0; i < m; i++) {
+ if (count == n - 1) {
+ break;
+ }
+
+ int[] road = list.get(i);
+ if (findParent(road[0]) != findParent(road[1])) {
+ count++;
+ union(road[0], road[1]);
+
+ if (road[2] == 0) {
+ k++;
+ }
+ }
+ }
+
+ return firstUp ? (k + 1) * (k + 1) : k * k;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ list = new ArrayList<>();
+
+ for (int i = 0; i <= m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ if (a == 0 && b == 1 && c == 0) {
+ firstUp = true;
+ }
+
+ list.add(new int[]{a, b, c});
+ }
+ }
+
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ public static void union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_14621.java b/java/BOJ/Gold/III/G3_14621.java
new file mode 100644
index 0000000..568f04a
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_14621.java
@@ -0,0 +1,150 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14621
+ *
+ * ? ์ ๋ชฉ: ๋๋ง ์๋๋ ์ฐ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๊นฝ๋ฏธ๋ 24์ด ๋ชจํ์๋ก์ด๋ค. ๊นฝ๋ฏธ๋ ๋๋ง๋ฒ์ฌ๊ฐ ๋ ์ ์๋ค๋ฉฐ ์์ ์ ํ๋ก๊ทธ๋๋ฐ ๋ฅ๋ ฅ์ ์ด์ฉํ์ฌ ๋ฏธํ
์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ๋ฏธํ
์ฑ์ ๋ํ์์ ํ๊ฒ์ผ๋ก ๋ง๋ค์ด์ก์ผ๋ฉฐ ๋ํ๊ต๊ฐ์ ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ๋ง๋ค์๋ค.
+ * ์ด ์ฑ์ ์ฌ์ฉ์๋ค์ ์ํด ์ฌ์ฌ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ค. ์ด ๊ฒฝ๋ก๋ 3๊ฐ์ง ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
+ * ์ฌ์ฌ ๊ฒฝ๋ก๋ ์ฌ์ฉ์๋ค์ ์ฌ์ฌ์ ๋ง์กฑ์ํค๊ธฐ ์ํด ๋จ์ด ๋ํ๊ต์ ์ฌ์ด ๋ํ๊ต๋ค์ ์ฐ๊ฒฐํ๋ ๋๋ก๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
+ * ์ฌ์ฉ์๋ค์ด ๋ค์ํ ์ฌ๋๊ณผ ๋ฏธํ
ํ ์ ์๋๋ก ์ด๋ค ๋ํ๊ต์์๋ ๋ชจ๋ ๋ํ๊ต๋ก ์ด๋์ด ๊ฐ๋ฅํ ๊ฒฝ๋ก์ด๋ค.
+ * ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ๋ฏธํ
ํ ์ ์๋๋ก ์ด ๊ฒฝ๋ก์ ๊ธธ์ด๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋์ด์ผ ํ๋ค.
+ * ๋ง์ฝ ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ง์ฝ ์ผ์ชฝ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค๋ฉด, ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ๋ณด๋ผ์ ์ ๊ณผ ๊ฐ์ด ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๋ฉด ์์ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค ์ ์๋ค.
+ * ์ด๋, ์ฃผ์ด์ง๋ ๊ฑฐ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฌ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฒซ์งธ ์ค์ ํ๊ต์ ์ N์ ํ๊ต๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค. (2 โค N โค 1,000) (1 โค M โค 10,000)
+ * ๋์งธ ์ค์ ๊ฐ ํ๊ต๊ฐ ๋จ์ด ๋ํ๊ต๋ผ๋ฉด M, ์ฌ์ด ๋ํ๊ต๋ผ๋ฉด W์ด ์ฃผ์ด์ง๋ค.
+ * ๋ค์ M๊ฐ์ ์ค์ u v d๊ฐ ์ฃผ์ด์ง๋ฉฐ uํ๊ต์ vํ๊ต๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ ์ด ๊ฑฐ๋ฆฌ๋ d์์ ๋ํ๋ธ๋ค. (1 โค u, v โค N) , (1 โค d โค 1,000)
+ *
+ * 5 7 -> n m
+ * M W W W M -> boys[1] ~ boys[n]
+ * 1 2 12 -> a, b, c
+ * 1 3 10 -> a, b, c
+ * 4 2 5 -> a, b, c
+ * 5 2 5 -> a, b, c
+ * 2 5 10 -> a, b, c
+ * 3 4 3 -> a, b, c
+ * 5 4 7 -> a, b, c
+ *
+ * ? ์ถ๋ ฅ
+ * ๊นฝ๋ฏธ๊ฐ ๋ง๋ ์ฑ์ ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค. (๋ชจ๋ ํ๊ต๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก๊ฐ ์์ ๊ฒฝ์ฐ -1์ ์ถ๋ ฅํ๋ค.)
+ *
+ * 34
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 372ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 226MB
+ * * ์ธ์ด: JAVA8
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G3_14621 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static boolean[] boys;
+ static ArrayList list;
+
+ // * ์ด๊ธฐ ์ค์
+ static int count = 0, length = 0;
+ static int[] parent;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ kruskal(); // * 2. ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
+
+ // * 3. ๋ชจ๋ ๋ํ๊ต๊ฐ ์ฐ๊ฒฐ๋์ ๋ ๊ทธ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅ vs ์ฐ๊ฒฐ ๋ชปํ์ ๋ -1 ์ถ๋ ฅ
+ bw.write(String.valueOf(count == n-1 ? length : -1));
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ boys = new boolean[n+1];
+ int p = 1;
+ for (String s: br.readLine().split(" ")) {
+ if (s.equals("M")) {
+ boys[p++] = true;
+ } else {
+ boys[p++] = false;
+ }
+ }
+
+ list = new ArrayList<>();
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ list.add(new int[] {a, b, c});
+ }
+ list.sort((school1, school2) -> school1[2] - school2[2]); // * ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
+ parent = IntStream.range(0, n+1).toArray();
+ }
+
+ // ! ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
+ public static void kruskal() {
+ for (int i = 0; i < list.size(); i++) {
+ if (count == n-1) {
+ break;
+ }
+
+ int[] con = list.get(i);
+ if (boys[con[0]] == boys[con[1]]) { // * ๋จ์ด๋ํ - ๋จ์ด๋ํ | ์ฌ์ด๋ํ - ์ฌ์ด๋ํ ์ฌ์ด์ ๊ฒฝ๋ก๋ ํจ์ค
+ continue;
+ }
+
+ if (union(con[0], con[1])) { // * ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๋๋ค๋ฉด ํด๋น ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ณ ๊ฒฝ๋ก ๊ธธ์ด ์
๋ฐ์ดํธ
+ count++;
+ length += con[2];
+ }
+ }
+ }
+
+ // ! UNION_FIND (ํฉ์งํฉ ์ฐพ๊ธฐ)
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+
+ return parent[node];
+ }
+
+ // ! UNION_FIND (ํฉ์งํฉ ์ฐพ๊ธฐ)
+ public static boolean union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a == b) {
+ return false;
+ }
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ return true;
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_14950.java b/java/BOJ/Gold/III/G3_14950.java
new file mode 100644
index 0000000..a55e06c
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_14950.java
@@ -0,0 +1,122 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14950
+ *
+ * ? ์ ๋ชฉ: ์ ๋ณต์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์๊ฐ ๋๋ผ๋ N๊ฐ์ ๋์์ M๊ฐ์ ๋๋ก๋ก ์ด๋ฃจ์ด์ก๋ค. ๋ชจ๋ ๋์์ ์์๋ ๊ทธ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก๋ก ๊ตฌ์ฑ๋ ๊ฒฝ๋ก๊ฐ ์๋ค. ๊ฐ ๋๋ก๋ ์๋ฐฉํฅ ๋๋ก์ด๋ฉฐ, ๊ฐ ๋๋ก๋ ์ฌ์ฉํ๋๋ฐ ํ์ํ ๋น์ฉ์ด ์กด์ฌํ๋ค. ๊ฐ๊ฐ ๋์๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ์ ธ ์๋ค. ๊ทธ ์ค์์ 1๋ฒ ๋์์ ๊ตฐ์ฃผ ๋ฐ๊ฑด์ ๋ชจ๋ ๋์๋ฅผ ์ ๋ณตํ๊ณ ์ถ์ดํ๋ค.
+ * ์ฒ์ ์ ๊ฑฐํ๊ณ ์๋ ๋์๋ 1๋ฒ ๋์ ๋ฟ์ด๋ค. ๋ง์ฝ ํน์ ๋์ B๋ฅผ ์ ๋ณตํ๊ณ ์ถ๋ค๋ฉด, B์ ๋๋ก๋ก ์ฐ๊ฒฐ๋ ๋์๋ค ์ค์์ ์ ์ด๋ ํ๋๋ฅผ ์ ๋ณตํ๊ณ ์์ด์ผ ํ๋ค. ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋์ ์ค์์ ํ๋์ธ A๋ฅผ ์ ํํ๋ฉด, B๋ฅผ ์ ๋ณตํ๋ ๊ณผ์ ์์ A์ B๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๋น์ฉ์ด ์๋ชจ๋๋ค. ๋ฐ๊ฑด์ ํ๋ฒ์ ํ๋์ ๋์๋ง ์ ๋ณต์ ์๋ํ๊ณ ์ธ์ ๋ ์ฑ๊ณตํ๋ค. ํ ๋ฒ ๋์๊ฐ ์ ๋ณต๋๋ฉด, ๋ชจ๋ ๋์๋ ๊ฒฝ๊ณ๋ฅผ ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋๋ก์ ๋น์ฉ์ด t๋งํผ ์ฆ๊ฐํ๊ฒ ๋๋ค. ํ ๋ฒ ์ ๋ณตํ ๋์๋ ๋ค์ ์ ๋ณตํ์ง ์๋๋ค.
+ * ์ด๋ ๋ฐ๊ฑด์ด ๋ชจ๋ ๋์๋ฅผ ์ ๋ณตํ๋๋ฐ ์ฌ์ฉ๋๋ ์ต์ ๋น์ฉ์ ๊ตฌํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N๊ณผ ๋๋ก์ ๊ฐ์ M๊ณผ ํ๋ฒ ์ ๋ณตํ ๋๋ง๋ค ์ฆ๊ฐํ๋ ๋๋ก์ ๋น์ฉ t๊ฐ ์ฃผ์ด์ง๋ค. N์ 10000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , M์ 30000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. t๋ 10์ดํ์ ์์ฐ์์ด๋ค.
+ * M๊ฐ์ ์ค์๋ ๋๋ก๋ฅผ ๋ํ๋ด๋ ์ธ ์์ฐ์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค. A์ B์ฌ์ด์ ๋น์ฉ์ด C์ธ ๋๋ก๊ฐ ์๋ค๋ ๋ป์ด๋ค. A์ B๋ N์ดํ์ ์๋ก ๋ค๋ฅธ ์์ฐ์์ด๋ค. C๋ 10000 ์ดํ์ ์์ฐ์์ด๋ค.
+ *
+ * 4 5 8 -> n m t
+ * 1 2 3 -> a b c
+ * 1 3 2 -> a b c
+ * 2 3 2 -> a b c
+ * 2 4 4 -> a b c
+ * 3 4 1 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ชจ๋ ๋์๋ฅผ ์ ๋ณตํ๋๋ฐ ์ฌ์ฉ๋๋ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ์์ค.
+ *
+ * 29
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.468์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 31MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G3_14950 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, m, t;
+ static int[] parent;
+ static ArrayList list;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int answer = kruskal();
+ System.out.println(answer);
+ }
+
+ public static int kruskal() {
+ int count = 0;
+ int cost = 0;
+
+ for (int i = 0; i < m; i++) {
+ int[] road = list.get(i);
+
+ if (count == n-1) {
+ break;
+ }
+
+ if (union(road[0], road[1])) {
+ cost += road[2] + t * count;
+ count++;
+ }
+ }
+
+ return cost;
+ }
+
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ public static boolean union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a == b) {
+ return false;
+ }
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+
+ return true;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ t = Integer.parseInt(st.nextToken());
+
+ parent = IntStream.range(0, n+1).toArray();
+ list = new ArrayList<>();
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ list.add(new int[] {a, b, c});
+ }
+
+ list.sort((a, b) -> a[2] - b[2]);
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_16437.java b/java/BOJ/Gold/III/G3_16437.java
new file mode 100644
index 0000000..abef194
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16437.java
@@ -0,0 +1,119 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16437
+ *
+ * ? ์ ๋ชฉ: ์ ๊ตฌ์ถ ์์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * N๊ฐ์ ์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง ๋๋ผ๊ฐ ์์ต๋๋ค. ์ฌ๋ค์ 1๋ฒ ์ฌ๋ถํฐ N๋ฒ ์ฌ๊น์ง ์์ต๋๋ค.
+ * 1๋ฒ ์ฌ์๋ ๊ตฌ๋ช
๋ณดํธ๋ง ์๊ณ ๋ค๋ฅธ ์ฌ์๋ ์๋ค ๋๋ ๋๋๋ค์ด ์ด๊ณ ์์ต๋๋ค.
+ * ๋์ด๋๋ ๋๋์ ๊ฐ์ฒด ์๋ฅผ ๊ฐ๋นํ ์ ์๋ ์๋ค์ ๊ตฌ๋ช
๋ณดํธ๋ฅผ ํ๊ณ ๋๋๊ฐ ์๋ ๋๋ผ๋ก ์ด์ฃผํ๊ธฐ๋ก ํ์ต๋๋ค.
+ * ๊ฐ ์ฌ์์ 1๋ฒ ์ฌ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ ์ผํ๋ฉฐ i๋ฒ ์ฌ์๋ pi๋ฒ ์ฌ์ผ๋ก ๊ฐ๋ ๋ค๋ฆฌ๊ฐ ์์ต๋๋ค.
+ * ์๋ค์ 1๋ฒ ์ฌ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉฐ ๋๋๋ค์ ์๋ ์๋ ์ฌ์์ ์์ง์ด์ง ์๊ณ ์ฌ์ผ๋ก ๋ค์ด์จ ์๋ค์ ์ก์๋จน์ต๋๋ค. ๋๋๋ ๋ ๋ ตํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ๋ค์ด์จ ์์ ํญ์ ์ก์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ํ ๋ง๋ฆฌ๋ ์ต๋ ํ ๋ง๋ฆฌ์ ์๋ง ์ก์๋จน์ต๋๋ค.
+ * ์ผ๋ง๋ ๋ง์ ์์ด 1๋ฒ ์ฌ์ ๋๋ฌํ ์ ์์๊น์?
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ์ฌ์ ๊ฐ์ N (2 โค N โค 123,456) ์ด ์ฃผ์ด์ง๋๋ค.
+ * ๋ ๋ฒ์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์ 2๋ฒ ์ฌ๋ถํฐ N๋ฒ ์ฌ๊น์ง ์ฌ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ti, ai, pi (1 โค ai โค 109, 1 โค pi โค N) ๊ฐ ์ฃผ์ด์ง๋๋ค.
+ * ti๊ฐ 'W' ์ธ ๊ฒฝ์ฐ i๋ฒ ์ฌ์ ๋๋๊ฐ ai๋ง๋ฆฌ๊ฐ ์ด๊ณ ์์์, ti๊ฐ 'S'์ธ ๊ฒฝ์ฐ i๋ฒ ์ฌ์ ์์ด ai๋ง๋ฆฌ๊ฐ ์ด๊ณ ์์์ ์๋ฏธํฉ๋๋ค. pi๋ i๋ฒ์งธ ์ฌ์์ pi๋ฒ ์ฌ์ผ๋ก ๊ฐ ์ ์๋ ๋ค๋ฆฌ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
+ *
+ * 4 -> n
+ * S 100 3 -> sw c next
+ * W 50 1 -> sw c next
+ * S 10 1 -> sw c next
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ๊ตฌ์ถํ ์ ์๋ ์์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
+ *
+ * 60
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.436์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 61MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G3_16437 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n;
+ static int[] degree;
+ static int[] adj;
+ static long[][] arr;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ topologicalSort();
+ System.out.println(arr[1][0]);
+ }
+
+ public static void topologicalSort() {
+ Queue queue = new LinkedList<>();
+ for (int i = 1; i <= n; i++) {
+ if (degree[i] == 0) {
+ queue.add(i);
+ }
+ }
+
+ while (!queue.isEmpty()) {
+ int cur = queue.poll();
+
+ if (cur == 1) {
+ break;
+ }
+
+ int next = adj[cur];
+
+ if (arr[cur][0] != 0) {
+ if (arr[next][1] < arr[cur][0]) {
+ arr[next][0] += (arr[cur][0] - arr[next][1]);
+ arr[next][1] = 0;
+ arr[cur][0] = 0;
+ } else {
+ arr[next][1] -= arr[cur][0];
+ arr[cur][0] = 0;
+ }
+ }
+
+
+ if (--degree[next] == 0) {
+ queue.add(next);
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ degree = new int[n + 1];
+ adj = new int[n + 1];
+ arr = new long[n + 1][2];
+
+ for (int i = 2; i <= n; i++) {
+ st = new StringTokenizer(br.readLine());
+ String sw = st.nextToken();
+ int c = Integer.parseInt(st.nextToken());
+ int next = Integer.parseInt(st.nextToken());
+
+ if (sw.equals("S")) {
+ arr[i][0] = c;
+ } else {
+ arr[i][1] = c;
+ }
+ adj[i] = next;
+ degree[next]++;
+ }
+
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_16724.java b/java/BOJ/Gold/III/G3_16724.java
new file mode 100644
index 0000000..2424057
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16724.java
@@ -0,0 +1,122 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16724
+ *
+ * ? ์ ๋ชฉ: ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด ์ฑ์ฐ๋ ์ค๋๋ ํผ๋ฆฌ๋ฅผ ๋ถ๋ค.
+ * ์ฑ์ฐ๊ฐ ํผ๋ฆฌ๋ฅผ ๋ถ ๋๋ฉด ์๊ณผ์ผ ํ์๋ค์ ์๊ธฐ๋ ๋ชจ๋ฅด๊ฒ ์ฑ์ฐ๊ฐ ์ ํด๋์ ๋ฐฉํฅ๋๋ก ์์ง์ด๊ธฐ ์์ํ๋ค. ์ฑ์ฐ๊ฐ ์ ํด๋์ ๋ฐฉํฅ์ ์ด 4๊ฐ์ง๋ก U, D, L, R์ด๊ณ ๊ฐ๊ฐ ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ํ๋ค.
+ * ์ด๋ฅผ ์ง์ผ๋ณด๋ ์ฌํ์ด๋ ๋ ์ด์ ์์ง์ด๊ธฐ ํ๋ค์ดํ๋ ์๊ณผ์ผ ํ์๋ค์ ์งํค๊ธฐ ์ํด ํน์ ์ง์ ์ โSAFE ZONEโ ์ด๋ผ๋ ์ต์ฒจ๋จ ๋ฐฉ์ ์์ค์ ๋ง๋ค์ด ํ์๋ค์ด ์ฑ์ฐ์ ํผ๋ฆฌ ์๋ฆฌ๋ฅผ ๋ฃ์ง ๋ชปํ๊ฒ ํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ์์ฐ์ด ๋๋ํ์ง ์์ ์ฌํ์ด๋ ์ฑ์ฐ๊ฐ ์ค์ ํด ๋์ ๋ฐฉํฅ์ ๋ถ์ํด์ ์ต์ ๊ฐ์์ โSAFE ZONEโ์ ๋ง๋ค๋ ค ํ๋ค.
+ * ์ฑ์ฐ๊ฐ ์ค์ ํ ๋ฐฉํฅ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋ ์ฌํ์ด๋ฅผ ๋์์ ์๊ณผ์ผ ํ์๋ค์ด ์ง๋ ์ด๋ ๊ตฌ์ญ์ ์๋๋ผ๋ ์ฑ์ฐ๊ฐ ํผ๋ฆฌ๋ฅผ ๋ถ ๋ โSAFE ZONEโ์ ๋ค์ด๊ฐ ์ ์๊ฒ ํ๋ โSAFE ZONEโ์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ์ง๋์ ํ์ ์๋ฅผ ๋ํ๋ด๋ N(1 โค N โค 1,000)๊ณผ ์ง๋์ ์ด์ ์๋ฅผ ๋ํ๋ด๋ M(1 โค M โค 1,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ง๋์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ๊ธธ์ด๊ฐ M์ธ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค.
+ * ์ง๋ ๋ฐ์ผ๋ก ๋๊ฐ๋ ๋ฐฉํฅ์ ์
๋ ฅ์ ์ฃผ์ด์ง์ง ์๋๋ค.
+ *
+ * 3 4 -> n m
+ * DLLL -> arr[0][0] ~ arr[0][m-1]
+ * DRLU
+ * RRRU -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ๋ฒ์งธ ์ค์ โSAFE ZONEโ์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.312์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 28MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+
+public class G3_16724 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int count = 0;
+ static boolean[][] visited;
+ static int[][] route;
+
+ // * 4๋ฐฉ(DULR)
+ static HashMap dir = new HashMap<>();
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ๋ฐฉ๋ฌธํ์ง ์์ ์์น์์ DFS์ํ
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (!visited[i][j]) {
+ visited[i][j] = true;
+ dfs(i, j);
+ }
+ }
+ }
+
+ // * 3. ๋
๋ฆฝ๋ ๊ฒฝ๋ก์ ๊ฐ์ ์ถ๋ ฅ
+ System.out.println(count);
+ }
+
+ // DFS
+ public static int dfs(int x, int y) {
+ if (route[x][y] > 0) {
+ return route[x][y];
+ }
+
+ int nx = x + dir.get(arr[x][y])[0];
+ int ny = y + dir.get(arr[x][y])[1];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ return ++count;
+ }
+
+ // ๋ฐฉ๋ฌธํ๋ ๊ณณ์ผ ๋
+ if (visited[nx][ny]) {
+ // ํ์ฌ DFS ๊ฒฝ๋ก ์์์ ์ธ์ดํด์ด ๋ฐ์ํ ๊ฒฝ์ฐ
+ if (route[nx][ny] == 0) {
+ route[x][y] = ++count; // ๋
๋ฆฝ๋ ๊ฒฝ๋ก์ ๊ฐ์ + 1
+ } else { // ์ด๋ฏธ ์ฐพ์๋ ๊ฒฝ๋ก์ธ ๊ฒฝ์ฐ
+ route[x][y] = route[nx][ny]; // ํด๋น ๊ฒฝ๋ก์ ํฌํจ
+ }
+ return route[x][y];
+ }
+
+ visited[nx][ny] = true;
+ route[x][y] = dfs(nx, ny);
+ return route[x][y];
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ route = new int[n][m];
+ visited = new boolean[n][m];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ dir.put('D', new int[] {1, 0});
+ dir.put('U', new int[] {-1, 0});
+ dir.put('R', new int[] {0, 1});
+ dir.put('L', new int[] {0, -1});
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_16932.java b/java/BOJ/Gold/III/G3_16932.java
new file mode 100644
index 0000000..f59e46f
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16932.java
@@ -0,0 +1,145 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16932
+ *
+ * ? ์ ๋ชฉ: ๋ชจ์ ๋ง๋ค๊ธฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * NรM์ธ ๋ฐฐ์ด์์ ๋ชจ์์ ์ฐพ์ผ๋ ค๊ณ ํ๋ค. ๋ฐฐ์ด์ ๊ฐ ์นธ์๋ 0๊ณผ 1 ์ค์ ํ๋๊ฐ ๋ค์ด์๋ค. ๋ ์นธ์ด ์๋ก ๋ณ์ ๊ณต์ ํ ๋, ๋ ์นธ์ ์ธ์ ํ๋ค๊ณ ํ๋ค.
+ * 1์ด ๋ค์ด ์๋ ์ธ์ ํ ์นธ๋ผ๋ฆฌ ์ฐ๊ฒฐํ์ ๋, ๊ฐ๊ฐ์ ์ฐ๊ฒฐ ์์๋ฅผ ๋ชจ์์ด๋ผ๊ณ ๋ถ๋ฅด์. ๋ชจ์์ ํฌ๊ธฐ๋ ๋ชจ์์ ํฌํจ๋์ด ์๋ 1์ ๊ฐ์์ด๋ค.
+ * ๋ฐฐ์ด์ ์นธ ํ๋์ ๋ค์ด์๋ ์๋ฅผ ๋ณ๊ฒฝํด์ ๋ง๋ค ์ ์๋ ๋ชจ์์ ์ต๋ ํฌ๊ธฐ๋ฅผ ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฐฐ์ด์ ํฌ๊ธฐ N๊ณผ M์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋ฐฐ์ด์ ๋ค์ด์๋ ์๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 3 3 -> n m
+ * 0 1 1 -> arr[0][0] ~ arr[0][m-1]
+ * 0 0 1
+ * 0 1 0 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ ํ๋๋ฅผ ๋ณ๊ฒฝํด์ ๋ง๋ค ์ ์๋ ๋ชจ์์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ ํ
+ * 2 โค N, M โค 1,000
+ * 0๊ณผ 1์ ๊ฐ์๋ ํ๋ ์ด์์ด๋ค.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 3.452์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 209MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.*;
+
+public class G3_16932 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, m;
+ static int[][] arr, groupNum;
+ static boolean[][] visit;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ static int[] group;
+ static int num;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int max = 0;
+
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (arr[i][j] == 1 && !visit[i][j]) {
+ num++;
+ visit[i][j] = true;
+ groupNum[i][j] = num;
+ group[num] = 1;
+ dfs(i, j);
+ }
+ }
+ }
+
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (arr[i][j] == 0) {
+ int count = 0;
+ Set set = new HashSet<>();
+ for (int k = 0; k < 4; k++) {
+ int nx = i + dx[k];
+ int ny = j + dy[k];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ continue;
+ }
+
+ if (groupNum[nx][ny] != 0) {
+ set.add(groupNum[nx][ny]);
+ }
+ }
+
+ for (int g : set) {
+ count += group[g];
+ }
+
+ max = Math.max(max, count);
+ }
+ }
+ }
+
+ System.out.println(max+1);
+ }
+
+ public static void dfs(int x, int y) {
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m || visit[nx][ny]) {
+ continue;
+ }
+
+ if (arr[nx][ny] == 1) {
+ visit[nx][ny] = true;
+ groupNum[nx][ny] = num;
+ group[num]++;
+ dfs(nx, ny);
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][m];
+ visit = new boolean[n][m];
+ groupNum = new int[n][m];
+
+ num = 0;
+
+ int count = 0;
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ if (arr[i][j] == 1) {
+ count++;
+ }
+ }
+ }
+
+ group = new int[count+1];
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_16940.java b/java/BOJ/Gold/III/G3_16940.java
new file mode 100644
index 0000000..008af76
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16940.java
@@ -0,0 +1,122 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16940
+ *
+ * ? ์ ๋ชฉ: BFS ์คํ์
์ ์ง
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * BOJ์์ ์ ๋ต์ด ์ฌ๋ฌ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ์คํ์
์ ์ง๋ฅผ ์ฌ์ฉํ๋ค. ์คํ์
์ ์ง๋ ์ ์ ๊ฐ ์ถ๋ ฅํ ๋ต์ ๊ฒ์ฆํ๋ ์ฝ๋๋ฅผ ํตํด์ ์ ๋ต ์ ๋ฌด๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ด๋ค. ์ค๋์ ์คํ์
์ ์ง ์ฝ๋๋ฅผ ํ๋ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค.
+ * ์ ์ ์ ๊ฐ์๊ฐ N์ด๊ณ , ์ ์ ์ 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ์๋ ์๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์์ ๋, BFS ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ * ํ์ ์์ ์ ์ ์ ๋ฃ๋๋ค. ์ด ๋ฌธ์ ์์ ์์ ์ ์ ์ 1์ด๋ค. 1์ ๋ฐฉ๋ฌธํ๋ค๊ณ ์ฒ๋ฆฌํ๋ค.
+ * ํ๊ฐ ๋น์ด ์์ง ์์ ๋์ ๋ค์์ ๋ฐ๋ณตํ๋ค.
+ * ํ์ ๋ค์ด์๋ ์ฒซ ์ ์ ์ ํ์์ ๊บผ๋ธ๋ค. ์ด ์ ์ ์ x๋ผ๊ณ ํ์.
+ * x์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ y๋ฅผ ๋ชจ๋ ํ์ ๋ฃ๋๋ค. ๋ชจ๋ y๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ์ฒ๋ฆฌํ๋ค.
+ * 2-2 ๋จ๊ณ์์ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ์์๋ ์ค์ํ์ง ์๋ค. ๋ฐ๋ผ์, BFS์ ๊ฒฐ๊ณผ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ๋์ฌ ์ ์๋ค.
+ * ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฌ๋ฐ๋ฅธ BFS ๋ฐฉ๋ฌธ ์์์ธ์ง ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ ์ ์ ์ N(2 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์๋ ํธ๋ฆฌ์ ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋ง์ง๋ง ์ค์๋ BFS ๋ฐฉ๋ฌธ ์์๊ฐ ์ฃผ์ด์ง๋ค. BFS ๋ฐฉ๋ฌธ ์์๋ ํญ์ N๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, 1๋ถํฐ N๊น์ง ์์ฐ์๊ฐ ํ ๋ฒ์ฉ ๋ฑ์ฅํ๋ค.
+ *
+ * 4 -> n
+ * 1 2 -> a b
+ * 1 3 -> a b
+ * 2 4 -> a b
+ * 1 2 3 4 -> sequence
+ *
+ * ? ์ถ๋ ฅ
+ * ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง BFS ๋ฐฉ๋ฌธ ์์๊ฐ ์ฌ๋ฐ๋ฅธ ์์๋ฉด 1, ์๋๋ฉด 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.808์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 75MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.*;
+
+public class G3_16940 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, result;
+ static ArrayList[] arr;
+ static int[] sequence, order;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[] visited;
+
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bfs(); // * 2. BFS
+ System.out.println(result); // * 3. ๊ฒฐ๊ณผ ์ถ๋ ฅ
+ }
+
+ private static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(1);
+ visited[1] = true;
+
+ int idx = 0;
+ while (!queue.isEmpty()) {
+ int cur = queue.poll();
+
+ if (sequence[idx++] != cur) {
+ result = 0;
+ break;
+ }
+
+ for (int next : arr[cur]) {
+ if (!visited[next]) {
+ visited[next] = true;
+ queue.add(next);
+ }
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ result = 1;
+
+ arr = new ArrayList[n+1];
+ order = new int[n+1];
+ visited = new boolean[n+1];
+
+ for (int i = 1; i <= n; i++) {
+ arr[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ arr[a].add(b);
+ arr[b].add(a);
+ }
+
+ sequence = new int[n];
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ sequence[i] = Integer.parseInt(st.nextToken());
+ order[sequence[i]] = i;
+ }
+
+ // ************ ์ฃผ์ด์ง ํ์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ์ ๋
ธ๋๋ฆฌ์คํธ ๋ฐฐ์ด ์ ๋ ฌ *****************
+ for (int i = 1; i <= n; i++) {
+ arr[i].sort((a, b) -> order[a] - order[b]);
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_16947.java b/java/BOJ/Gold/III/G3_16947.java
new file mode 100644
index 0000000..5058e65
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16947.java
@@ -0,0 +1,159 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16947
+ *
+ * ? ์ ๋ชฉ: ์์ธ ์งํ์ฒ 2ํธ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์งํ์ฒ 2ํธ์ ์๋ 51๊ฐ์ ์ญ์ด ์๊ณ , ์ญ๊ณผ ์ญ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ตฌ๊ฐ์ด 51๊ฐ ์๋ค. ์ฆ, ์ ์ ์ด 51๊ฐ์ด๊ณ , ์๋ฐฉํฅ ๊ฐ์ ์ด 51๊ฐ์ธ ๊ทธ๋ํ๋ก ๋ํ๋ผ ์ ์๋ค. 2ํธ์ ์ ์ํ์ 1๊ฐ์ 2๊ฐ์ ์ง์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ํ ์ญ์์ ์ถ๋ฐํด์ ๊ณ์ ๊ฐ๋ฉด ๋ค์ ์ถ๋ฐํ ์ญ์ผ๋ก ๋์์ฌ ์ ์๋ ๋
ธ์ ์ ์ํ์ ์ด๋ผ๊ณ ํ๋ค. ์ง์ ์ ์ํ์ ์ ์ํ๋ ํ ์ญ์์ ์์ํ๋ ํธ๋ฆฌ ํํ์ ๋
ธ์ ์ด๋ค.
+ * ๋ ์ญ(์ ์ ) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ ์ง๋์ผ ํ๋ ๊ตฌ๊ฐ(๊ฐ์ )์ ๊ฐ์์ด๋ค. ์ญ A์ ์ํ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ A์ ์ํ์ ์ ์ํ๋ ์ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ์ค ์ต์๊ฐ์ด๋ค.
+ * ์งํ์ฒ 2ํธ์ ๊ณผ ๊ฐ์ ํํ์ ๋
ธ์ ๋๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ ์ญ๊ณผ ์ํ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ญ์ ๊ฐ์ N(3 โค N โค 3,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ญ๊ณผ ์ญ์ ์ฐ๊ฒฐํ๋ ๊ตฌ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ์ ๊ตฌ๊ฐ์ด ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๊ณ , ์ญ์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. ์์์ ๋ ์ญ ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ํญ์ ์กด์ฌํ๋ ๋
ธ์ ๋ง ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 6 -> n
+ * 1 2 -> a b
+ * 3 4 -> a b
+ * 6 4 -> a b
+ * 2 3 -> a b
+ * 1 3 -> a b
+ * 3 5 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ์ด N๊ฐ์ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. 1๋ฒ ์ญ๊ณผ ์ํ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ, 2๋ฒ ์ญ๊ณผ ์ํ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ, ..., N๋ฒ ์ญ๊ณผ ์ํ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ถ๋ ฅํ๋ค.
+ *
+ * 0 0 0 1 1 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 608ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 236MB
+ * * ์ธ์ด: JAVA8
+*/
+package Gold.III;
+
+import java.io.*;
+import java.util.*;
+
+public class G3_16947 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static ArrayList[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean isCycle = false; // ์ฌ์ดํด์ด ๋ฐ์ํ๋์ง
+ static int cycleStart, cycleEnd; // ์ฌ์ดํด ์์์ , ์ฌ์ดํด ์ข
๋ฃ์
+ static boolean[] cycleVisited; // ์ฌ์ดํด ํ์ธ DFS๋ฅผ ์ํ ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ
+ static int[] before; // ์ฌ์ดํด ๋ฃจํธ๋ฅผ ํ์ธํ๊ธฐ ์ํ ์ด์ ๋
ธ๋ arr[cur] = prev
+ static int[] cycle; // ์ํ์ญ๊น์ง์ ์ต์๊ฑฐ๋ฆฌ ๋ฐฐ์ด
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ dfs(1, 1); // * 2. DFS๋ฅผ ์ด์ฉํ์ฌ ์ํํ ๋๊น์ง ํ์
+ findCycle(); // * 3. ์ํ(์ฌ์ดํด)์ด ๋ฐ์ํ๋ ์ญ๋ค์ ์ฐพ์๋ด๊ธฐ (before ์ด์ฉ)
+
+ // * 4. ์ํ์ญ์ ํฌํจ๋์ง ์์ ์ญ๋ค์ BFS๋ฅผ ์ด์ฉํ์ฌ ์ํ์ญ๊น์ง์ ์ต์๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ
+ for (int i = 1; i <= n; i++) {
+ if (cycle[i] == -1) {
+ bfs(i);
+ }
+ }
+
+ // * 5. cycle ๋ฐฐ์ด ์ถ๋ ฅํ๊ธฐ (1๋ฒ์ญ ~ N๋ฒ์ญ)
+ StringBuffer sb = new StringBuffer();
+ for (int i = 1; i <= n; i++) {
+ sb.append(cycle[i] + " ");
+ }
+
+ bw.write(sb.toString());
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! DFS
+ public static void dfs(int cur, int prev) {
+ cycleVisited[cur] = true;
+ before[cur] = prev;
+
+ for (int next: arr[cur]) {
+ if (cycleVisited[next] && next != prev) { // * ๋ฐ๋ก ์ง์ ์ ๋
ธ๋๊ฐ ์๋ ๊ณณ์ ๋ฐฉ๋ฌธํ๋๋ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋์ผ ๋(์ฌ์ดํด ๋ฐ์)
+ if (!isCycle) { // * ์ด๋ฏธ ์ฌ์ดํด์ด ๋ฐ์ํ ์ ์ด ์๋ค๋ฉด
+ cycleStart = next; // ์ฌ์ดํด ์์์
+ cycleEnd = cur; // ์ฌ์ดํด ์ข
๋ฃ์
+ isCycle = true; // ์ฌ์ดํด์ด ์ด๋ฏธ ๋ฐ์ํ๋ค๊ณ ํ์
+ }
+ return;
+ } else if (!cycleVisited[next]) { // * ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ์ญ์ผ ๋
+ dfs(next, cur); // DFS ์ฌ๊ท ์ํ
+ }
+ }
+ }
+
+ // ! cycleEnd๋ถํฐ cycleStart๊น์ง์ ๊ฒฝ๋ก๋ฅผ ์ญ์ถ์ ํด์ cycle๋ฐฐ์ด์ ๊ฐ์ 0์ผ๋ก ํ์ํ๋ ํจ์
+ public static void findCycle() {
+ while (cycleEnd != cycleStart) {
+ cycle[cycleEnd] = 0;
+ cycleEnd = before[cycleEnd];
+ }
+ cycle[cycleEnd] = 0;
+ }
+
+ // ! BFS: ์ํ์ญ(cycle[์ํ์ญ๋ฒํธ] = 0)๊น์ง์ ์ต์๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์
+ public static void bfs(int start) {
+ Queue queue = new LinkedList<>();
+ boolean[] visited = new boolean[n+1];
+ queue.add(new int[] {start, 0});
+ visited[start] = true;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cycle[cur[0]] == 0) { // * ์ํ์ญ์ ๋์ฐฉํ๋ค๋ฉด
+ cycle[start] = cur[1]; // * ํ์ฌ ๊ฑฐ๋ฆฌ๋ฅผ ์ต์๊ฑฐ๋ฆฌ๋ก ์ ์ฅํ๊ณ ์ข
๋ฃ
+ return;
+ }
+
+ for (int next: arr[cur[0]]) {
+ if (!visited[next]) {
+ visited[next] = true;
+ queue.add(new int[] {next, cur[1] + 1});
+ }
+ }
+ }
+
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new ArrayList[n+1];
+ cycleVisited = new boolean[n+1];
+ before = new int[n+1];
+ cycle = new int[n+1];
+ Arrays.fill(cycle, -1);
+
+ for (int i = 1; i <= n; i++) {
+ arr[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ arr[a].add(b);
+ arr[b].add(a);
+ }
+ }
+
+}
diff --git a/java/BOJ/Gold/III/G3_16954.java b/java/BOJ/Gold/III/G3_16954.java
new file mode 100644
index 0000000..0e75259
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16954.java
@@ -0,0 +1,159 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16954
+ *
+ * ! ์ ๋ชฉ: ์์ง์ด๋ ๋ฏธ๋ก ํ์ถ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * !๋ฌธ์
+ * ์ฑ์ ๋ ํ๊ต ์์ ๋ก ํฌ๊ธฐ๊ฐ 8ร8์ธ ์ฒด์คํ์์ ํ์ถํ๋ ๊ฒ์์ ๋ง๋ค์๋ค. ์ฒด์คํ์ ๋ชจ๋ ์นธ์ ๋น ์นธ ๋๋ ๋ฒฝ ์ค ํ๋์ด๋ค. ์ฑ์ ์ ์บ๋ฆญํฐ๋ ๊ฐ์ฅ ์ผ์ชฝ ์๋ซ ์นธ์ ์๊ณ , ์ด ์บ๋ฆญํฐ๋ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ ์นธ์ผ๋ก ์ด๋ํด์ผ ํ๋ค.
+ * ์ด ๊ฒ์์ ํน์ง์ ๋ฒฝ์ด ์์ง์ธ๋ค๋ ์ ์ด๋ค. 1์ด๋ง๋ค ๋ชจ๋ ๋ฒฝ์ด ์๋์ ์๋ ํ์ผ๋ก ํ ์นธ์ฉ ๋ด๋ ค๊ฐ๊ณ , ๊ฐ์ฅ ์๋์ ์์ด์ ์๋์ ํ์ด ์๋ค๋ฉด ๋ฒฝ์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค. ์ฑ์ ์ ์บ๋ฆญํฐ๋ 1์ด์ ์ธ์ ํ ํ ์นธ ๋๋ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ธ์ ํ ํ ์นธ์ผ๋ก ์ด๋ํ๊ฑฐ๋, ํ์ฌ ์์น์ ์ ์์ ์ ์๋ค. ์ด๋ํ ๋๋ ๋น ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค.
+ * 1์ด ๋์ ์ฑ์ ์ ์บ๋ฆญํฐ๊ฐ ๋จผ์ ์ด๋ํ๊ณ , ๊ทธ ๋ค์ ๋ฒฝ์ด ์ด๋ํ๋ค. ๋ฒฝ์ด ์บ๋ฆญํฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ฉด ๋ ์ด์ ์บ๋ฆญํฐ๋ ์ด๋ํ ์ ์๋ค.
+ * ์ฑ์ ์ ์บ๋ฆญํฐ๊ฐ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋์ง ์๋์ง ๊ตฌํด๋ณด์.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * 8๊ฐ ์ค์ ๊ฑธ์ณ์ ์ฒด์คํ์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. '.'์ ๋น ์นธ, '#'๋ ๋ฒฝ์ด๋ค. ๊ฐ์ฅ ์ผ์ชฝ ์๋ซ์นธ์ ํญ์ ๋ฒฝ์ด ์๋๋ค.
+ *
+ * ........ -> arr[0][0][0] ~ arr[0][0][n-1] ( n = 8 )
+ * ........
+ * ........
+ * ........
+ * ........
+ * .#######
+ * #.......
+ * ........ -> arr[0][n-1][0] ~ arr[0][n-1][n-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฑ์ ์ ์บ๋ฆญํฐ๊ฐ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ ์นธ์ ๋์ฐฉํ ์ ์์ผ๋ฉด 1, ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ! ์ฑ์ ๊ฒฐ๊ณผ
+ * ? ์๊ฐ: 84ms
+ * ? ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * ? ์ธ์ด: JAVA8
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class G3_16954 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ
+ static int n = 8;
+ static char[][][] arr = new char[100][n][n];
+
+ // * ์ด๊ธฐ ์ค์
+ static int count;
+ static boolean result = false;
+ static ArrayList walls = new ArrayList<>();
+
+ // * 9๊ฐ์ง ๋ฐฉํฅ: ์, ํ, ์ข, ์ฐ, ์ข์, ์ขํ, ์ฐ์, ์ฐํ, ์ ์๋ฆฌ
+ static int[] dx = {1, 1, 1, -1, -1, -1, 0, 0, 0};
+ static int[] dy = {1, -1, 0, 1, -1, 0, 1, -1, 0};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ findWall(); // * ๋ฒฝ์ ์์น ์ฐพ๊ธฐ
+ down(); // * 1์ดํ๋ถํฐ 99์ดํ์ ๋ฒฝ์ ์์น ์ค์ => arr[1] ~ arr[99]
+ bfs(); // * BFS ์ํ
+
+ bw.write(String.valueOf(result ? 1 : 0)); // * ๊ฒฐ๊ณผ ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ boolean[][][] visited = new boolean[100][n][n]; // ์ด๋จ์๋ณ 3์ฐจ์ ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ์์ฑ
+ queue.add(new int[] {0, n-1, 0}); // 0์ด์ผ ๋ ์ข์ธก ์ตํ๋จ์ธ [0, n-1, 0] => [์๊ฐ, ํ, ์ด]
+ visited[0][n-1][0] = true; // ์ด๊ธฐ์์น ๋ฐฉ๋ฌธํ์
+
+ // BFS
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll(); // ํ์ฌ ์์น
+
+ // ํ์ฌ ์๊ฐ์ ํ์ฌ ์์น๊ฐ ๋ฒฝ์ผ ๊ฒฝ์ฐ ํจ์ค
+ if (arr[cur[0]][cur[1]][cur[2]] == '#') {
+ continue;
+ }
+
+ // ํ์ฌ ์์น๊ฐ ์ต์ข
์์น์ผ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์ผ๋ก ๋ฐ๊พธ๊ณ ์ ์ฒด ์ข
๋ฃ
+ if (cur[1] == 0 && cur[2] == n-1) {
+ result = true;
+ return;
+ }
+
+ // 9๊ฐ์ง ๋ฐฉํฅ์ ๋ํ์ฌ
+ for (int i = 0; i < 9; i++) {
+ int nx = cur[1] + dx[i];
+ int ny = cur[2] + dy[i];
+
+ // * ๋ฒ์์ฒดํฌ + ๋ค์์์น์ ๋ค์์๊ฐ์ผ๋ก ๋ฐฉ๋ฌธํ์ ์ด ์๋์ง ์ฒดํฌ + ๋ค์์์น๊ฐ ํ์ฌ์๊ฐ์ ๋ฒฝ์ธ์ง ์ฒดํฌ + ๋ค์์์น๊ฐ ๋ค์์๊ฐ์ ๋น๊ณต๊ฐ์ธ์ง ์ฒดํฌ
+ if (0 <= nx && nx < n && 0 <= ny && ny < n && !visited[cur[0]+1][nx][ny] && arr[cur[0]][nx][ny] != '#' && arr[cur[0]+1][nx][ny] == '.') {
+ visited[cur[0]+1][nx][ny] = true; // ๋ฐฉ๋ฌธ ํ์
+ queue.add(new int[] {cur[0]+1, nx, ny}); // ํ์ ์ฝ์
+ }
+ }
+
+ }
+ }
+
+ // ! 1์ดํ๋ถํฐ 99์ดํ๊น์ง ๋ฏธ๋ก์ ์ํ๋ฅผ ์ฐพ๋ ํจ์ (99์ดํ๊น์ง ๋๋ํ๊ฒ ์ก์)
+ public static void down() {
+ count = 1;
+ boolean canDown = true;
+
+ for (int i = 1; i < 100; i++) {
+ for (int j = 0; j < n; j++) {
+ for (int k = 0; k < n; k++) {
+ arr[i][j][k] = '.';
+ }
+ }
+ }
+
+ // ๋ฏธ๋ก ๋ฒ์์์ ์๋ ๋ฒฝ์ด ์์๋๊น์ง
+ while (canDown) {
+ canDown = false;
+
+ for (int[] wall: walls) {
+ if (wall[0] < n-1) {
+ canDown = true;
+ wall[0]++;
+ arr[count][wall[0]][wall[1]] = '#';
+ }
+ }
+
+ count++;
+ }
+ }
+
+ // ! 0์ด์ผ ๋ ์ด๊ธฐ ๋ฒฝ์ ์์น๋ฅผ ์ฐพ๋ ํจ์
+ public static void findWall() {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (arr[0][i][j] == '#') {
+ walls.add(new int[] {i, j});
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ for (int i = 0; i < n; i++) {
+ arr[0][i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_16988.java b/java/BOJ/Gold/III/G3_16988.java
new file mode 100644
index 0000000..8b49371
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_16988.java
@@ -0,0 +1,144 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16988
+ *
+ * ? ์ ๋ชฉ: ๋งํฌ ์ฐธ์กฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฐ๋ํ์ ํ์ ๊ฐฏ์์ ์ด์ ๊ฐฏ์๋ฅผ ๋ํ๋ด๋ N(3 โค N โค 20)๊ณผ M(3 โค M โค 20)์ด ํ ์นธ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ M๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0, 1, 2์ด๋ค. 0์ ๋น ์นธ, 1์ ๋์ ๋, 2๋ ์๋์ ๋์ ์๋ฏธํ๋ค. ๋น ์นธ์ด 2๊ฐ ์ด์ ์กด์ฌํจ๊ณผ ํ์ฌ ๋ฐ๋ํ์์ ์ ํ๋ ์ด์ด ๋ชจ๋ ์๋๋ฐฉ์ ๋๋ก ๋นํ์์ด ์์์ธ์ธ ๊ทธ๋ฃน์ด ์์์ด ๋ชจ๋ ๋ณด์ฅ๋๋ค.
+ *
+ * 3 4 -> n m
+ * 2 0 0 0 -> arr[0][0] ~ arr[0][m-1]
+ * 0 0 0 0
+ * 0 0 0 2 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํ์ฌ ํ์์ ๋ 2๊ฐ๋ฅผ ๋์ด ์ฃฝ์ผ ์ ์๋ ์๋ ๋์ ์ต๋ ๊ฐฏ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.476์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 222MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G3_16988 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, m;
+ static int max = 0;
+ static int total = 0;
+
+ static int count;
+ static int[][] arr;
+ static boolean[][] visit;
+ static ArrayList list;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+ for (int i = 0; i < list.size()-1; i++) {
+ for (int j = i+1; j < list.size(); j++) {
+ arr[list.get(i)[0]][list.get(i)[1]] = 1;
+ arr[list.get(j)[0]][list.get(j)[1]] = 1;
+
+ count = 0;
+ visit = new boolean[n][m];
+
+ for (int a = 0; a < n; a++) {
+ for (int b = 0; b < m; b++) {
+ if (arr[a][b] == 2 && !visit[a][b]) {
+ total = 0;
+ bfs(a, b);
+ }
+ }
+ }
+
+ max = Math.max(max, count);
+
+ arr[list.get(i)[0]][list.get(i)[1]] = 0;
+ arr[list.get(j)[0]][list.get(j)[1]] = 0;
+ }
+ }
+
+ bw.write(String.valueOf(max));
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void bfs(int x, int y) {
+ visit[x][y] = true;
+
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {x, y});
+ boolean hasBlank = false;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (arr[cur[0]][cur[1]] == 2) {
+ total++;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m || visit[nx][ny] || arr[nx][ny] == 1) {
+ continue;
+ }
+
+ if (arr[nx][ny] == 0) {
+ hasBlank = true;
+ continue;
+ }
+
+ if (arr[nx][ny] == 2 && !visit[nx][ny]) {
+ visit[nx][ny] = true;
+ queue.add(new int[] {nx, ny});
+ }
+ }
+ }
+
+
+ if (!hasBlank) {
+ count += total;
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ list = new ArrayList<>();
+
+ arr = new int[n][m];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ if (arr[i][j] == 0) {
+ list.add(new int[] {i, j});
+ }
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_17090.java b/java/BOJ/Gold/III/G3_17090.java
new file mode 100644
index 0000000..605db74
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_17090.java
@@ -0,0 +1,122 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17090
+ *
+ * ? ์ ๋ชฉ: ๋ฏธ๋ก ํ์ถํ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ํฌ๊ธฐ๊ฐ NรM์ธ ๋ฏธ๋ก๊ฐ ์๊ณ , ๋ฏธ๋ก๋ ํฌ๊ธฐ๊ฐ 1ร1์ธ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋ฏธ๋ก์ ๊ฐ ์นธ์๋ ๋ฌธ์๊ฐ ํ๋ ์ ํ์๋๋ฐ, ์ ํ์๋ ๋ฌธ์์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค.
+ * ์ด๋ค ์นธ(r, c)์ ์ ํ ๋ฌธ์๊ฐ
+ *
+ * U์ธ ๊ฒฝ์ฐ์๋ (r-1, c)๋ก ์ด๋ํด์ผ ํ๋ค.
+ * R์ธ ๊ฒฝ์ฐ์๋ (r, c+1)๋ก ์ด๋ํด์ผ ํ๋ค.
+ * D์ธ ๊ฒฝ์ฐ์๋ (r+1, c)๋ก ์ด๋ํด์ผ ํ๋ค.
+ * L์ธ ๊ฒฝ์ฐ์๋ (r, c-1)๋ก ์ด๋ํด์ผ ํ๋ค.
+ *
+ * ๋ฏธ๋ก์์ ํ์ถ ๊ฐ๋ฅํ ์นธ์ ์๋ฅผ ๊ณ์ฐํด๋ณด์. ํ์ถ ๊ฐ๋ฅํ ์นธ์ด๋, ๊ทธ ์นธ์์ ์ด๋์ ์์ํด์ ์นธ์ ์ ํ๋๋ก ์ด๋ํ์ ๋, ๋ฏธ๋ก์ ๊ฒฝ๊ณ ๋ฐ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ ์นธ์ ์๋ฏธํ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ฏธ๋ก์ ํฌ๊ธฐ N, M(3 โค N, M โค 500)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋ฏธ๋ก์ ๊ฐ ์นธ์ ์ ํ ๋ฌธ์๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 3 3 -> n m
+ * DDD -> arr[0][0] ~ arr[0][m-1]
+ * DDD
+ * DDD -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํ์ถ ๊ฐ๋ฅํ ์นธ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 9
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.208์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 57MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+public class G3_17090 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m;
+ static char[][] arr;
+ static boolean[][] visit;
+ static int[][] answer;
+ static Map dir;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (answer[i][j] == 0) {
+ visit[i][j] = true;
+ dfs(i, j);
+ visit[i][j] = false;
+ }
+ }
+ }
+
+ int count = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (answer[i][j] == 1) {
+ count++;
+ }
+ }
+ }
+
+ System.out.println(count);
+ }
+
+ public static int dfs(int x, int y) {
+ int[] d = dir.get(arr[x][y]);
+ int nx = x + d[0];
+ int ny = y + d[1];
+
+ if (answer[x][y] != 0) {
+ return answer[x][y];
+ }
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ return answer[x][y] = 1;
+ }
+
+ if (visit[nx][ny]) {
+ return answer[x][y] = -1;
+ }
+
+ visit[nx][ny] = true;
+ answer[x][y] = dfs(nx, ny);
+ visit[nx][ny] = false;
+
+ return answer[x][y];
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ visit = new boolean[n][m];
+ answer = new int[n][m];
+ arr = new char[n][m];
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ dir = new HashMap<>();
+ dir.put('D', new int[] {1, 0});
+ dir.put('U', new int[] {-1, 0});
+ dir.put('L', new int[] {0, -1});
+ dir.put('R', new int[] {0, 1});
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_17135.java b/java/BOJ/Gold/III/G3_17135.java
new file mode 100644
index 0000000..1146dbc
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_17135.java
@@ -0,0 +1,182 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17135
+ *
+ * ? ์ ๋ชฉ: ์บ์ฌ ๋ํ์ค
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์บ์ฌ ๋ํ์ค๋ ์ฑ์ ํฅํด ๋ชฐ๋ ค์ค๋ ์ ์ ์ก๋ ํด ๋ฐฉ์์ ๊ฒ์์ด๋ค. ๊ฒ์์ด ์งํ๋๋ ๊ณณ์ ํฌ๊ธฐ๊ฐ NรM์ธ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ฒฉ์ํ์ 1ร1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๊ฐ ์นธ์ ํฌํจ๋ ์ ์ ์๋ ์ต๋ ํ๋์ด๋ค. ๊ฒฉ์ํ์ N๋ฒํ์ ๋ฐ๋ก ์๋(N+1๋ฒ ํ)์ ๋ชจ๋ ์นธ์๋ ์ฑ์ด ์๋ค.
+ * ์ฑ์ ์ ์๊ฒ์ ์งํค๊ธฐ ์ํด ๊ถ์ 3๋ช
์ ๋ฐฐ์นํ๋ ค๊ณ ํ๋ค. ๊ถ์๋ ์ฑ์ด ์๋ ์นธ์ ๋ฐฐ์นํ ์ ์๊ณ , ํ๋์ ์นธ์๋ ์ต๋ 1๋ช
์ ๊ถ์๋ง ์์ ์ ์๋ค. ๊ฐ๊ฐ์ ํด๋ง๋ค ๊ถ์๋ ์ ํ๋๋ฅผ ๊ณต๊ฒฉํ ์ ์๊ณ , ๋ชจ๋ ๊ถ์๋ ๋์์ ๊ณต๊ฒฉํ๋ค. ๊ถ์๊ฐ ๊ณต๊ฒฉํ๋ ์ ์ ๊ฑฐ๋ฆฌ๊ฐ D์ดํ์ธ ์ ์ค์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ด๊ณ , ๊ทธ๋ฌํ ์ ์ด ์ฌ๋ฟ์ผ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ์ ์ ๊ณต๊ฒฉํ๋ค. ๊ฐ์ ์ ์ด ์ฌ๋ฌ ๊ถ์์๊ฒ ๊ณต๊ฒฉ๋นํ ์ ์๋ค. ๊ณต๊ฒฉ๋ฐ์ ์ ์ ๊ฒ์์์ ์ ์ธ๋๋ค. ๊ถ์์ ๊ณต๊ฒฉ์ด ๋๋๋ฉด, ์ ์ด ์ด๋ํ๋ค. ์ ์ ์๋๋ก ํ ์นธ ์ด๋ํ๋ฉฐ, ์ฑ์ด ์๋ ์นธ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ์๋ ๊ฒ์์์ ์ ์ธ๋๋ค. ๋ชจ๋ ์ ์ด ๊ฒฉ์ํ์์ ์ ์ธ๋๋ฉด ๊ฒ์์ด ๋๋๋ค.
+ * ๊ฒ์ ์ค๋ช
์์ ๋ณด๋ค์ํผ ๊ถ์๋ฅผ ๋ฐฐ์นํ ์ดํ์ ๊ฒ์ ์งํ์ ์ ํด์ ธ์๋ค. ๋ฐ๋ผ์, ์ด ๊ฒ์์ ๊ถ์์ ์์น๊ฐ ์ค์ํ๋ค. ๊ฒฉ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ถ์์ ๊ณต๊ฒฉ์ผ๋ก ์ ๊ฑฐํ ์ ์๋ ์ ์ ์ต๋ ์๋ฅผ ๊ณ์ฐํด๋ณด์.
+ * ๊ฒฉ์ํ์ ๋ ์์น (r1, c1), (r2, c2)์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๊ฒฉ์ํ ํ์ ์ N, ์ด์ ์ M, ๊ถ์์ ๊ณต๊ฒฉ ๊ฑฐ๋ฆฌ ์ ํ D๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒฉ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 1์ ์ ์ด ์๋ ์นธ์ด๋ค.
+ *
+ * 5 5 1 -> n m d
+ * 0 0 0 0 0 -> arr[0][0] ~ arr[0][m-1]
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 0 0 0 0 0
+ * 1 1 1 1 1 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ถ์์ ๊ณต๊ฒฉ์ผ๋ก ์ ๊ฑฐํ ์ ์๋ ์ ์ ์ต๋ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ ํ
+ * 3 โค N, M โค 15
+ * 1 โค D โค 10
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 172ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 40MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 7
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G3_17135 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m, d;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = 0; // ์ฃฝ์ผ ์ ์๋ ์ ์ ์ต๋๊ฐ
+ static int count = 0; // ๊ถ์ ๋ฐฐ์น๋ง๋ค ์ฃฝ์ผ ์ ์๋ ์ ์ ์
+ static int[] archers = new int[3]; // ๊ถ์ ๋ฐฐ์น
+ static int[][] castle; // ๊ถ์ ๋ฐฐ์น๋ง๋ค ์ด๊ธฐ ์ ์ ์์น
+
+ // * 3๋ฐฉ( ์ผ์ชฝ ์ ์ค๋ฅธ์ชฝ )
+ static int[] dx = {0, -1, 0};
+ static int[] dy = {-1, 0, 1};
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ setArcher(0, 0); // * 2. ๊ถ์ ๋ฐฐ์น์ ๋ชจ๋ ์กฐํฉ๋ง๋ค ์ฃฝ์ผ ์ ์๋ ์ ์ ์๋ฅผ ๊ตฌํ๊ณ ๊ทธ๋์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
+
+ bw.write(String.valueOf(max)); // * 3. ์ ๋ต ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ d = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][m];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+
+ }
+
+ // ! ๊ถ์ ๋ฐฐ์น์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ(์กฐํฉ)
+ public static void setArcher(int len, int start) {
+ if (len == 3) {
+ play(); // * ๊ฐ ๋ฐฐ์น๋ง๋ค play ์คํ
+ return;
+ }
+
+ for (int i = start; i < m; i++) {
+ archers[len] = i;
+ setArcher(len+1, i+1);
+ }
+ }
+
+ // ! ๊ถ์ ๋ฐฐ์น๊ฐ ๋๋ฌ๋ค๋ฉด n๋ฒ์ ํด๋์ ๊ถ์๋ค์ด ์ฃฝ์ผ ์ ์๋ ์ ๋ค์ ๋์ ํด์ ๋ํ๊ธฐ(count)
+ public static void play() {
+ count = 0;
+ castle = new int[n][m];
+ for (int i = 0; i < n; i++) {
+ castle[i] = arr[i].clone();
+ }
+
+ for (int k = 0; k < n; k++) {
+ for (int i = 0; i < archers.length; i++) {
+ findEnemy(archers[i]); // * ํ์ฌ ๊ฒฉ์ ์ํ์์ 3๋ช
์ ๊ถ์๋ค์ด ์ ์ ์ฃฝ์ด๊ธฐ(ํ๋ช
์ ์ ์ด ์ฌ๋ฌ๋ช
์ ๊ถ์์๊ฒ ๋ง์ ์ ์์)
+ }
+ down(); // * ํ ํด์ด ๋๋ฌ๋ค๋ฉด ๋ฐ์ผ๋ก ํ์นธ ๋ด๋ฆผ
+ }
+
+ // * ๋ชจ๋ ํด์ด ๋๋ฌ๋ค๋ฉด ์ฃฝ์ธ ์ ์ ์๋ฅผ ์ต๋๊ฐ๊ณผ ๋น๊ตํ์ฌ ์
๋ฐ์ดํธ
+ if (max < count) {
+ max = count;
+ }
+ }
+
+ // ! ํ์ฌ ๊ถ์์ ์์น์์ ์ฃฝ์ผ ์ ์๋ ์ ์ ์ฐพ๊ธฐ
+ public static void findEnemy(int archer) {
+ boolean[][] visited = new boolean[n][m];
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {n, archer, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[2] == d) {
+ continue;
+ }
+
+ for (int i = 0; i < 3; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m || visited[nx][ny]) {
+ continue;
+ }
+
+ // ์ ์ ์์น์ผ ๋
+ if (castle[nx][ny] >= 1) {
+ if (castle[nx][ny] == 1) {
+ count++;
+ }
+ castle[nx][ny]++; // * ์ค๋ณต์ผ๋ก ์ ์ ๊ณต๊ฒฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต ๊ณต๊ฒฉ๋นํ๋ค๋ ๊ฒ์ ํ์ํ๊ธฐ ์ํด +1
+ return;
+ }
+
+ visited[nx][ny] = true;
+ queue.add(new int[] {nx, ny, cur[2]+1});
+ }
+ }
+
+ }
+
+ // ! ์ ๋ค์ ์์น๋ฅผ ํ์นธ ๋ด๋ฆฌ๋ ํจ์
+ public static void down() {
+ int[][] newArr = new int[n][m];
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (castle[i-1][j] >= 2) { // * ์ ์ด ์ฃฝ์๋ค๋ฉด 0์ผ๋ก ์
ํ
+ newArr[i][j] = 0;
+ } else {
+ newArr[i][j] = castle[i-1][j];
+ }
+ }
+ }
+ castle = newArr;
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_17182.java b/java/BOJ/Gold/III/G3_17182.java
new file mode 100644
index 0000000..9f6495a
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_17182.java
@@ -0,0 +1,110 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17182
+ *
+ * ? ์ ๋ชฉ: ์ฐ์ฃผ ํ์ฌ์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ฐ์ฃผ ํ์ฌ์ anaํธ๋ ์ด๋ค ํ์ฑ๊ณ๋ฅผ ํ์ฌํ๊ธฐ ์ํด ๋ฐ์ฌ๋๋ค. ๋ชจ๋ ํ์ฑ์ ํ์ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ๊ณ์ฐํ๋ ค ํ๋ค. ์
๋ ฅ์ผ๋ก๋ anaํธ๊ฐ ํ์ํ ํ์ฑ์ ๊ฐ์์ anaํธ๊ฐ ๋ฐ์ฌ๋๋ ํ์ฑ์ ์์น์ anaํธ๊ฐ ํ์ฑ ๊ฐ ์ด๋์ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด 2์ฐจ์ ํ๋ ฌ๋ก ์ฃผ์ด์ง๋ค. ํ์ฑ์ ์์น๋ 0๋ถํฐ ์์ํ์ฌ 0์ ํ๋ ฌ์์ 0๋ฒ์งธ ์ธ๋ฑ์ค์ ํด๋นํ๋ ํ์ฑ์ ์๋ฏธํ๋ค. 2์ฐจ์ ํ๋ ฌ์์ i, j ๋ฒ ์์๋ i ๋ฒ์งธ ํ์ฑ์์ j ๋ฒ์งธ ํ์ฑ์ ๋๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ํ๋ธ๋ค. i์ j๊ฐ ๊ฐ์ ๋๋ ํญ์ 0์ด ์ฃผ์ด์ง๋ค. ๋ชจ๋ ํ์ฑ์ ํ์ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ๊ณ์ฐํ์ฌ๋ผ.
+ * ํ์ฌ ํ ๋ค์ ์์ ํ์ฑ์ผ๋ก ๋์์ฌ ํ์๋ ์์ผ๋ฉฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ํ์ฑ๋ ์ค๋ณตํด์ ๊ฐ ์ ์๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ ๋ฒ์งธ ์ค์๋ ํ์ฑ์ ๊ฐ์ N๊ณผ anaํธ๊ฐ ๋ฐ์ฌ๋๋ ํ์ฑ์ ์์น K๊ฐ ์ฃผ์ด์ง๋ค. (2 โค N โค 10, 0 โค K < N)
+ * ๋ค์ N ์ค์ ๊ฑธ์ณ ๊ฐ ํ์ฑ ๊ฐ ์ด๋ ์๊ฐ Tij ๊ฐ N ๊ฐ ์ฉ ๋์ด์ฐ๊ธฐ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. (0 โค Tij โค 1000)
+ *
+ * 3 0 -> n start
+ * 0 30 1 -> arr[0][0] ~ arr[0][n-1]
+ * 1 0 29
+ * 28 1 0 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ชจ๋ ํ์ฑ์ ํ์ฌํ๊ธฐ ์ํ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.12์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 5
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class G3_17182 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, start;
+ static int[][] arr;
+ static ArrayList[] visit;
+ static int pass;
+ static int min = Integer.MAX_VALUE;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ floydWarshall();
+ backTracking(start, (1 << start), 0);
+ System.out.println(min);
+ }
+
+ public static void backTracking(int cur, int visit, int time) {
+ if (visit == pass) {
+ min = Math.min(min, time);
+ return;
+ }
+
+ for (int i = 0; i < n; i++) {
+ if (cur == i) {
+ continue;
+ }
+
+ if ((visit & (1 << i)) == 0) {
+ backTracking(i, visit | (1 << i), time + arr[cur][i]);
+ }
+ }
+ }
+
+
+ public static void floydWarshall() {
+ for (int k = 0; k < n; k++) {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (k == i || i == j) {
+ continue;
+ }
+
+ if (arr[i][j] > arr[i][k] + arr[k][j]) {
+ arr[i][j] = arr[i][k] + arr[k][j];
+ }
+ }
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ start = Integer.parseInt(st.nextToken());
+
+ pass = (1 << n) - 1;
+
+ visit = new ArrayList[n];
+ for (int i = 0; i < n; i++) {
+ visit[i] = new ArrayList<>();
+ }
+
+ arr = new int[n][n];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_1719.java b/java/BOJ/Gold/III/G3_1719.java
new file mode 100644
index 0000000..beddfdd
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_1719.java
@@ -0,0 +1,161 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง
+ * ? https://www.acmicpc.net/problem/1719
+ *
+ * ? ์ ๋ชฉ: ํ๋ฐฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ช
์ฐ๊ธฐ์
์ 2008๋
๋ถํฐ ํ๋ฐฐ ์ฌ์
์ ์๋ก์ด ์์ํ๊ธฐ๋ก ํ์๋ค. ์ฐ์ ํ๋ฐฐ ํ๋ฌผ์ ๋ชจ์์ ์ฒ๋ฆฌํ๋ ์งํ์ฅ์ ๋ช ๊ฐ ๋ง๋ จํ์ง๋ง, ํ๋ฐฐ ํ๋ฌผ์ด ๊ฐ ์งํ์ฅ๋ค ์ฌ์ด๋ฅผ ์ค๊ฐ ๋ ์ด๋ค ๊ฒฝ๋ก๋ฅผ ๊ฑฐ์ณ์ผ ํ๋์ง ๊ฒฐ์ ํ์ง ๋ชปํ๋ค. ์ด๋ค ๊ฒฝ๋ก๋ฅผ ๊ฑฐ์น ์ง ์ ํด์, ์ด๋ฅผ ๊ฒฝ๋กํ๋ก ์ ๋ฆฌํ๋ ๊ฒ์ด ์ฌ๋ฌ๋ถ์ด ํ ์ผ์ด๋ค.
+ * ์์๋ ๊ทธ๋ํ์์ ๊ตต๊ฒ ํ์๋ 1, 2, 3, 4, 5, 6์ ์งํ์ฅ์ ๋ํ๋ธ๋ค. ์ ์ ๊ฐ์ ๊ฐ์ ์ ๋ ์งํ์ฅ๊ฐ์ ํ๋ฌผ ์ด๋์ด ๊ฐ๋ฅํจ์ ๋ํ๋ด๋ฉฐ, ๊ฐ์ค์น๋ ์ด๋์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๋ค. ์ด๋ก๋ถํฐ ์ป์ด๋ด์ผ ํ๋ ๊ฒฝ๋กํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+ * ๊ฒฝ๋กํ๋ ํ ์งํ์ฅ์์ ๋ค๋ฅธ ์งํ์ฅ์ผ๋ก ์ต๋จ๊ฒฝ๋ก๋ก ํ๋ฌผ์ ์ด๋์ํค๊ธฐ ์ํด ๊ฐ์ฅ ๋จผ์ ๊ฑฐ์ณ์ผ ํ๋ ์งํ์ฅ์ ๋ํ๋ธ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด 4ํ 5์ด์ 6์ 4๋ฒ ์งํ์ฅ์์ 5๋ฒ ์งํ์ฅ์ผ๋ก ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํตํด ๊ฐ๊ธฐ ์ํด์๋ ์ ์ผ ๋จผ์ 6๋ฒ ์งํ์ฅ์ผ๋ก ์ด๋ํด์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค.
+ * ์ด์ ๊ฐ์ ๊ฒฝ๋กํ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ ์ n๊ณผ m์ด ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์์๋๋ก ์ฃผ์ด์ง๋ค. n์ ์งํ์ฅ์ ๊ฐ์๋ก 200์ดํ์ ์์ฐ์, m์ ์งํ์ฅ๊ฐ ๊ฒฝ๋ก์ ๊ฐ์๋ก 10000์ดํ์ ์์ฐ์์ด๋ค. ์ด์ด์ ํ ์ค์ ํ๋์ฉ ์งํ์ฅ๊ฐ ๊ฒฝ๋ก๊ฐ ์ฃผ์ด์ง๋๋ฐ, ๋ ์งํ์ฅ์ ๋ฒํธ์ ๊ทธ ์ฌ์ด๋ฅผ ์ค๊ฐ๋๋ฐ ํ์ํ ์๊ฐ์ด ์์๋๋ก ์ฃผ์ด์ง๋ค. ์งํ์ฅ์ ๋ฒํธ๋ค๊ณผ ๊ฒฝ๋ก์ ์์์๊ฐ์ ๋ชจ๋ 1000์ดํ์ ์์ฐ์์ด๋ค.
+ *
+ * 6 10 -> n m
+ * 1 2 2 -> a b c
+ * 1 3 1 -> a b c
+ * 2 4 5 -> a b c
+ * 2 5 3 -> a b c
+ * 2 6 7 -> a b c
+ * 3 4 4 -> a b c
+ * 3 5 6 -> a b c
+ * 3 6 7 -> a b c
+ * 4 6 4 -> a b c
+ * 5 6 2 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ์์๋ ๊ฒ๊ณผ ๊ฐ์ ํ์์ ๊ฒฝ๋กํ๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * - 2 3 3 2 2
+ * 1 - 1 4 5 5
+ * 1 1 - 4 5 6
+ * 3 2 3 - 6 6
+ * 2 2 3 6 - 6
+ * 5 5 3 4 5 -
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 672ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 37MB
+ * * ์ธ์ด: JAVA8
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+
+public class G3_1719 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m; // ์งํ์ฅ ๊ฐ์ , ๊ฒฝ๋ก ๊ฐ์
+ static int[][] arr; // i -> j๋ก ๋ฐ๋ก ๊ฐ๋ ๊ฒฝ๋ก ์ค ์ต๋จ๊ฑฐ๋ฆฌ
+
+ // * ์ด๊ธฐ ์ค์ : i๋ถํฐ j๊น์ง ์ต๋จ๊ฒฝ๋ก๋ก ๊ฐ๊ธฐ ์ํด ๊ฐ์ฅ ๋จผ์ ์ง๋์ผ ํ๋ ์งํ์ฅ ๋ฒํธ arr[i][j] = k (์ต๋จ๊ฑฐ๋ฆฌ: i -> k -> ... -> j)
+ static int[][] result;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ๋ชจ๋ ์งํ์ฅ์์ ๋ค๋ฅธ ๋ชจ๋ ์งํ์ฅ๊น์ง์ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
+ for (int i = 1; i <= n; i++) {
+ dijkstra(i);
+ }
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (result[i][j] == 0) {
+ sb.append("- ");
+ } else {
+ sb.append(result[i][j] + " ");
+ }
+ }
+ sb.append("\n");
+ }
+
+ bw.write(sb.toString());
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
+ public static void dijkstra(int start) {
+ int[] visited = new int[n+1]; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ๊ฒธ ์ต๋จ๊ฒฝ๋ก
+ Arrays.fill(visited, 200000); // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ๊ฐ์ ์ต๋๊ฐ์ผ๋ก ์ด๊ธฐํ
+
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> a[2] - b[2]); // ์์์๊ฐ ๊ฐ์ค์น์ ๋ฐ๋ฅธ ์ฐ์ ์์ํ(์ต์ํ)
+ pq.add(new int[] {start, start, 0}); // ์์ ์์น๋ฅผ ์ต์ํ์ ์ฝ์
+ visited[start] = 0; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ์ ์์์์น ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
+
+ // * ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
+ while (!pq.isEmpty()) {
+ int[] cur = pq.poll(); // * ํ์ฌ ์์น [ํ์ฌ ์งํ์ฅ ๋ฒํธ, ๊ฐ์ฅ ๋จผ์ ์ง๋์จ ์งํ์ฅ, ๋์ฐฉ ์๊ฐ]
+
+ // * ํ์ฌ ์์น์ ๋ฐฉ๋ฌธํ ์๊ฐ์ด ์ด๋ฏธ ๋ค๋ฅธ ์์น๋ก๋ถํฐ ์์๋ผ์ ๋ฐฉ๋ฌธํ ์๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด ํจ์ค
+ if (cur[2] > visited[cur[0]]) {
+ continue;
+ }
+
+ // * ํ์ฌ ์งํ์ฅ์์ ๊ฐ ์ ์๋ ๋ค๋ฅธ ๋ชจ๋ ์งํ์ฅ์ ๋ํ์ฌ
+ for (int i = 1; i <= n; i++) {
+ if (arr[cur[0]][i] != 0) { // ๊ฒฝ๋ก๊ฐ ์๊ณ
+ if (visited[i] >= cur[2] + arr[cur[0]][i]) { // ๊ธฐ์กด์ ๋์ฐฉํ ์๊ฐ๋ณด๋ค ์ง๊ธ ๋์ฐฉํ๋ ์๊ฐ์ด ๋ ์งง๊ฑฐ๋ ๊ฐ์ ๋
+ visited[i] = cur[2] + arr[cur[0]][i]; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ์ต๋จ๊ฒฝ๋ก ์๊ฐ ์
๋ฐ์ดํธ
+
+ // * ์ต์ํ์ ์ฝ์
(์ด๋, ๊ฐ์ฅ ๋จผ์ ์ง๋์จ ์งํ์ฅ์ด start์์น์ ๊ฐ๋ค๋ฉด i(๋ค์์งํ์ฅ ๋ฒํธ)๋ก ๋ณ๊ฒฝํ์ฌ ์ฝ์
+ pq.add(new int[] {i, cur[1] == start ? i : cur[1], visited[i]});
+
+ // * ๊ฐ์ฅ ๋จผ์ ์ง๋์จ ์งํ์ฅ์ด start์์น์ ๊ฐ๋ค๋ฉด ๊ฒฐ๊ณผ๊ฐ์ result[start][๋ค์์์น] = ๋ค์์์น
+ if (cur[1] == start) {
+ result[start][i] = i;
+ } else {
+ result[start][i] = cur[1];
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n+1][n+1];
+ result = new int[n+1][n+1];
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ if (arr[a][b] == 0) {
+ arr[a][b] = c;
+ } else {
+ arr[a][b] = Math.min(arr[a][b], c);
+ }
+
+ if (arr[b][a] == 0) {
+ arr[b][a] = c;
+ } else {
+ arr[b][a] = Math.min(arr[b][a], c);
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_1958.java b/java/BOJ/Gold/III/G3_1958.java
new file mode 100644
index 0000000..1123636
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_1958.java
@@ -0,0 +1,91 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1958
+ *
+ * ? ์ ๋ชฉ: LCS 3
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ฌธ์์ด๊ณผ ๋๊ธฐ๋ฅผ ์ธ์์์ ์ ์ผ ์ข์ํ๋ ์์์ด๋ ์ค๋๋ ๋ฌธ์์ด 2๊ฐ์ LCS(Longest Common Subsequence)๋ฅผ ๊ตฌํ๊ณ ์์๋ค. ์ด๋ ๋ ์์์ด๋ ์กฐ๊ต๋ค์ด ๋ฌธ์์ด 3๊ฐ์ LCS๋ฅผ ๊ตฌํ๋ ๊ฒ์ ๋ณด์๋ค. ์์์ด๋ ๋์ ํด ๋ณด์์ง๋ง ์คํจํ๊ณ ๋ง์๋ค.
+ * ์ด์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค. ์์์ด๋ฅผ ๋์์ ๋ฌธ์์ด 3๊ฐ์ LCS๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ ์ค์๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์์ด์ด, ๋์งธ ์ค์๋ ๋ ๋ฒ์งธ ๋ฌธ์์ด์ด, ์
์งธ ์ค์๋ ์ธ ๋ฒ์งธ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๊ฐ ๋ฌธ์์ด์ ์ํ๋ฒณ ์๋ฌธ์๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ธธ์ด๋ 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+ *
+ * abcdefghijklmn -> str1
+ * bdefg -> str2
+ * efg -> str3
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ์ค์ ์ฒซ ๋ฒ์งธ ๋ฌธ์์ด๊ณผ ๋ ๋ฒ์งธ ๋ฌธ์์ด๊ณผ ์ธ ๋ฒ์งธ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.116์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 17MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class G3_1958 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static String str1, str2, str3;
+
+ // * ์ด๊ธฐ ์ค์
+ static char[] arr1, arr2, arr3;
+ static int[][][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i <= str1.length(); i++) {
+ for (int j = 1; j <= str2.length(); j++) {
+ for (int k = 1; k <= str3.length(); k++) {
+ if (arr1[i] == arr2[j] && arr2[j] == arr3[k]) {
+ dp[i][j][k] = dp[i-1][j-1][k-1] + 1;
+ } else {
+ dp[i][j][k] = Math.max(dp[i-1][j][k], Math.max(dp[i][j-1][k], dp[i][j][k-1]));
+ }
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(dp[str1.length()][str2.length()][str3.length()]);
+ }
+
+ public static void input() throws IOException {
+ str1 = br.readLine();
+ str2 = br.readLine();
+ str3 = br.readLine();
+
+ arr1 = new char[str1.length()+1];
+ arr2 = new char[str2.length()+1];
+ arr3 = new char[str3.length()+1];
+
+ dp = new int[arr1.length][arr2.length][arr3.length];
+
+ for (int i = 0; i < str1.length(); i++) {
+ arr1[i+1] = str1.charAt(i);
+ }
+
+ for (int i = 0; i < str2.length(); i++) {
+ arr2[i+1] = str2.charAt(i);
+ }
+
+ for (int i = 0; i < str3.length(); i++) {
+ arr3[i+1] = str3.charAt(i);
+ }
+
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_2151.java b/java/BOJ/Gold/III/G3_2151.java
new file mode 100644
index 0000000..c4ca15a
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_2151.java
@@ -0,0 +1,158 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2151
+ *
+ * ? ์ ๋ชฉ: ๊ฑฐ์ธ ์ค์น
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ฑ์์ด๋ ๊ฑฐ์ธ์ ๋ค์ฌ๋ค๋ณด๋ ๊ฒ์ ์ฐธ ์ข์ํ๋ค. ๊ทธ๋์ ์ง ๊ณณ๊ณณ์ ๊ฑฐ์ธ์ ์ค์นํด๋๊ณ ์ง ์์ ๋์๋ค๋ ๋๋ง๋ค ๊ฑฐ์ธ์ ๋ณด๊ณค ํ๋ค.
+ * ์ฑ์์ด๋ ์ ํด๋ฅผ ๋ง์ดํ์ฌ ์ด์ฌ๋ฅผ ํ๊ฒ ๋์๋๋ฐ, ๊ฑฐ์ธ์ ์ข์ํ๋ ๊ทธ๋
์ ์ฑ๊ฒฉ ๋๋ฌธ์ ์ ์ง์๋ ๊ฑฐ์ธ์ ๋งค๋ฌ๋งํ ์์น๊ฐ ์ฌ๋ฌ ๊ณณ ์๋ค. ๋ํ ์ฑ์์ด๋ค ์ ์ง์๋ ๋ฌธ์ด ๋ ๊ฐ ์๋๋ฐ, ์ฑ์์ด๋ ๊ฑฐ์ธ์ ์ ์ค์นํ์ฌ ์ฅ๋์ ์น๊ณ ์ถ์ด์ก๋ค. ์ฆ, ํ ์ชฝ ๋ฌธ์์ ๋ค๋ฅธ ์ชฝ ๋ฌธ์ ๋ณผ ์ ์๋๋ก ๊ฑฐ์ธ์ ์ค์นํ๊ณ ์ถ์ด์ก๋ค.
+ * ์ฑ์์ด๋ค ์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ํ ์ชฝ ๋ฌธ์์ ๋ค๋ฅธ ์ชฝ ๋ฌธ์ ๋ณผ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ค์นํด์ผ ํ๋ ๊ฑฐ์ธ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ๊ฑฐ์ธ์ ์ค์นํ ๋์๋ 45๋ ๊ธฐ์ธ์ด์ง ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ค์นํด์ผ ํ๋ค. ๋ํ ๋ชจ๋ ๊ฑฐ์ธ์ ์๋ฉด ๊ฑฐ์ธ์ด๊ธฐ ๋๋ฌธ์ ์ ์ชฝ ๋ชจ๋์์ ๋ฐ์ฌ๊ฐ ์ผ์ด๋ ์ ์๋ค. ์ฑ์์ด๋ ๊ฑฐ์ธ์ ๋งค์ฐ ๋ง์ด ๊ฐ์ง๊ณ ์์ด์ ๊ฑฐ์ธ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ์.
+ * ๊ฑฐ์ธ์ ์ด๋ป๊ฒ ์ค์นํด๋ ํ ์ชฝ ๋ฌธ์์ ๋ค๋ฅธ ์ชฝ ๋ฌธ์ ๋ณผ ์ ์๋ ๊ฒฝ์ฐ๋ ์ฃผ์ด์ง์ง ์๋๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ง์ ํฌ๊ธฐ N (2 โค N โค 50)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ N๊ฐ์ ๋ฌธ์๋ก ์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. โ#โ๋ ๋ฌธ์ด ์ค์น๋ ๊ณณ์ผ๋ก ํญ์ ๋ ๊ณณ์ด๋ฉฐ, โ.โ์ ์๋ฌด ๊ฒ๋ ์๋ ๊ฒ์ผ๋ก ๋น์ ์ด ๊ณณ์ ํต๊ณผํ๋ค. โ!โ์ ๊ฑฐ์ธ์ ์ค์นํ ์ ์๋ ์์น๋ฅผ ๋ํ๋ด๊ณ , โ*โ์ ๋น์ด ํต๊ณผํ ์ ์๋ ๋ฒฝ์ ๋ํ๋ธ๋ค.
+ *
+ * 5 -> n
+ * ***#* -> arr[0][0] ~ arr[0][n-1]
+ * *.!.*
+ * *!.!*
+ * *.!.*
+ * *#*** -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ค์นํด์ผ ํ ๊ฑฐ์ธ์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 228ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 18MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.PriorityQueue;
+
+public class G3_2151 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static int n;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int answer = 0; // ์ ๋ต
+ static int[][][] visited; // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ
+ static int[][] door = new int[2][2]; // ๋ฌธ์์น
+
+ // * ์ํ์ข์ฐ (0: ์ํ์ด๋, 1: ์์ง์ด๋)
+ static int[][] dx = {{-1, 1}, {0, 0}};
+ static int[][] dy = {{0, 0}, {-1, 1}};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ findDoor(); // * 2. ๋ฌธ ์์น ์ฐพ๊ธฐ
+ findMirror(); // * 3. ๋ค์ต์คํธ๋ผ
+ System.out.println(answer); // * 4. ์ถ๋ ฅ
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new char[n][n];
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+
+ visited = new int[n][n][2];
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ for (int k = 0; k < 2; k++) {
+ visited[i][j][k] = 10000;
+ }
+ }
+ }
+ }
+
+ // ! ๋ฌธ ์์น ์ฐพ๊ธฐ
+ public static void findDoor() {
+ byte p = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (arr[i][j] == '#') {
+ door[p][0] = i;
+ door[p][1] = j;
+ p++;
+ }
+ }
+ }
+ }
+
+ // 0: ์ํ, 1 : ์์ง
+ // ! ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
+ public static void findMirror() {
+ // * ์ฐ์ ์์ ํ ์ฌ์ฉ
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> a[3] - b[3]);
+ pq.add(new int[] {door[0][0], door[0][1], 0, 0}); // ์ด๊ธฐ์์น ์ํ์ด๋
+ pq.add(new int[] {door[0][0], door[0][1], 1, 0}); // ์ด๊ธฐ์์น ์์ง์ด๋
+ visited[door[0][0]][door[0][1]][0] = 0;
+ visited[door[0][0]][door[0][1]][1] = 0;
+
+ // * ๋ค์ต์คํธ๋ผ
+ while (!pq.isEmpty()) {
+ int[] cur = pq.poll();
+
+ // ๋ฐ๋์ชฝ ๋ฌธ์ ๋์ฐฉํ์ ๋ ์ข
๋ฃ
+ if (cur[0] == door[1][0] && cur[1] == door[1][1]) {
+ answer = cur[3];
+ return;
+ }
+
+ // ์ด๋ฏธ ํด๋น ์์น ์ ์ด๋ ๋ฐฉํฅ์ ๋ ์ ์ ๊ฑฐ์ธ์ค์น ๊ฐ์๋ก ๋์ฐฉํ ๊ฒฝ์ฐ ํจ์ค
+ if (visited[cur[0]][cur[1]][cur[2]] < cur[3]) {
+ continue;
+ }
+
+ // ๊ฑฐ์ธ์ ๋์ ์ ์์ ๋
+ if (arr[cur[0]][cur[1]] == '!') {
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 2; j++) {
+ int nx = cur[0] + dx[i][j];
+ int ny = cur[1] + dy[i][j];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= n || arr[nx][ny] == '*') {
+ continue;
+ }
+
+ if (visited[nx][ny][i] > (i == cur[2] ? cur[3] : cur[3]+1)) {
+ visited[nx][ny][i] = (i == cur[2] ? cur[3] : cur[3]+1);
+ pq.add(new int[] {nx, ny, i, i == cur[2] ? cur[3] : cur[3]+1});
+ }
+ }
+ }
+ } else { // ๊ฑฐ์ธ์ ๋์ ์ ์์ ๋
+ for (int i = 0; i < 2; i++) {
+ int nx = cur[0] + dx[cur[2]][i];
+ int ny = cur[1] + dy[cur[2]][i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= n || arr[nx][ny] == '*') {
+ continue;
+ }
+
+ if (visited[nx][ny][cur[2]] > cur[3]) {
+ visited[nx][ny][cur[2]] = cur[3];
+ pq.add(new int[] {nx, ny, cur[2], cur[3]});
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/III/G3_2473.java b/java/BOJ/Gold/III/G3_2473.java
new file mode 100644
index 0000000..21ee6fe
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_2473.java
@@ -0,0 +1,101 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2473
+ *
+ * ? ์ ๋ชฉ: ์ธ ์ฉ์ก
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * KOI ๋ถ์ค ๊ณผํ์ฐ๊ตฌ์์์๋ ๋ง์ ์ข
๋ฅ์ ์ฐ์ฑ ์ฉ์ก๊ณผ ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ๋ณด์ ํ๊ณ ์๋ค. ๊ฐ ์ฉ์ก์๋ ๊ทธ ์ฉ์ก์ ํน์ฑ์ ๋ํ๋ด๋ ํ๋์ ์ ์๊ฐ ์ฃผ์ด์ ธ์๋ค. ์ฐ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ 1๋ถํฐ 1,000,000,000๊น์ง์ ์์ ์ ์๋ก ๋ํ๋ด๊ณ , ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ -1๋ถํฐ -1,000,000,000๊น์ง์ ์์ ์ ์๋ก ๋ํ๋ธ๋ค.
+ * ๊ฐ์ ์์ ์ธ ๊ฐ์ง ์ฉ์ก์ ํผํฉํ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํผํฉ์ ์ฌ์ฉ๋ ๊ฐ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ผ๋ก ์ ์ํ๋ค. ์ด ์ฐ๊ตฌ์์์๋ ๊ฐ์ ์์ ์ธ ๊ฐ์ง ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ด [-2, 6, -97, -6, 98]์ธ ๊ฒฝ์ฐ์๋ ํน์ฑ๊ฐ์ด -97์ -2์ธ ์ฉ์ก๊ณผ ํน์ฑ๊ฐ์ด 98์ธ ์ฉ์ก์ ํผํฉํ๋ฉด ํน์ฑ๊ฐ์ด -1์ธ ์ฉ์ก์ ๋ง๋ค ์ ์๊ณ , ์ด ์ฉ์ก์ด ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ด๋ค. ์ฐธ๊ณ ๋ก, ์ธ ์ข
๋ฅ์ ์์นผ๋ฆฌ์ฑ ์ฉ์ก๋ง์ผ๋ก๋ ํน์ ์ธ ์ข
๋ฅ์ ์ฐ์ฑ ์ฉ์ก๋ง์ผ๋ก ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ํผํฉ ์ฉ์ก์ ๋ง๋๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๋ค.
+ * ์ฐ์ฑ ์ฉ์ก๊ณผ ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ด ์ฃผ์ด์ก์ ๋, ์ด ์ค ๊ฐ์ ์์ ์ธ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ์ธ ์ฉ์ก์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฉ์ก์ ์ N์ด ์
๋ ฅ๋๋ค. N์ 3 ์ด์ 5,000 ์ดํ์ ์ ์์ด๋ค. ๋์งธ ์ค์๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ๋ํ๋ด๋ N๊ฐ์ ์ ์๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด ์๋ค์ ๋ชจ๋ -1,000,000,000 ์ด์ 1,000,000,000 ์ดํ์ด๋ค. N๊ฐ์ ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ ๋ชจ๋ ๋ค๋ฅด๊ณ , ์ฐ์ฑ ์ฉ์ก๋ง์ผ๋ก๋ ์์นผ๋ฆฌ์ฑ ์ฉ์ก๋ง์ผ๋ก ์
๋ ฅ์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์์ ์ ์๋ค.
+ *
+ * 5 -> n
+ * -2 6 -97 -6 98 -> arr[0] ~ arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ์ธ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ถ๋ ฅํ๋ค. ์ถ๋ ฅํด์ผํ๋ ์ธ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค. ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๊ฒฝ์ฐ๊ฐ ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ์๋ ๊ทธ ์ค ์๋ฌด๊ฒ์ด๋ ํ๋๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * -6 -3 -2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 168ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 14MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G3_2473 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] result = new int[3]; // * 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ธ ์ฉ์ก์ ํน์ฑ๊ฐ
+ static long max = Long.MAX_VALUE; // * ์ธ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ ์ ๋๊ฐ์ ์ต๋๊ฐ
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ํฌํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ์ธ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ ๋น๊ตํ์ฌ ํฉ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ธ ์ฉ์ก ์ฐพ๊ธฐ
+ for (int i = 0; i < arr.length-2; i++) {
+ int base = arr[i]; // * ๊ธฐ์ค์ด ๋๋ ์ฉ์ก
+ int left = i+1; // * ๊ธฐ์ค ์ฉ์ก๋ณด๋ค ํน์ฑ๊ฐ์ด ํฐ ์ฉ์ก ์ค ๊ฐ์ฅ ํน์ฑ๊ฐ์ด ์์ ์ฉ์ก
+ int right = arr.length-1; // * ํน์ฑ๊ฐ์ด ๊ฐ์ฅ ํฐ ์ฉ์ก
+
+ // * ํฌํฌ์ธํฐ
+ while (left < right) {
+ long sum = (long) base + arr[left] + arr[right];
+
+ // * 0์ ๋ ๊ฐ๊น์ด ์ธ ์ฉ์ก์ ์ฐพ์์ ๋, ๊ฒฐ๊ณผ์ max๊ฐ ์
๋ฐ์ดํธ
+ if (Math.abs(sum) <= max) {
+ max = Math.abs(sum);
+ result[0] = base;
+ result[1] = arr[left];
+ result[2] = arr[right];
+ }
+
+ // * ํน์ฑ๊ฐ์ ํฉ์ด ์์์ผ ๋ left ํฌ์ธํฐ 1์ฆ๊ฐ
+ if (sum < 0) {
+ left++;
+ } else { // * ํน์ฑ๊ฐ์ ํฉ์ด ์์์ผ ๋ right ํฌ์ธํฐ 1 ๊ฐ์
+ right--;
+ }
+
+ }
+ }
+
+ // * 3. ๊ฒฐ๊ณผ ์ถ๋ ฅ
+ System.out.println(result[0] + " " + result[1] + " " + result[2]);
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n];
+
+ int p = 0;
+ st = new StringTokenizer(br.readLine());
+
+ for (int i = 0; i < n; i++) {
+ arr[p++] = Integer.parseInt(st.nextToken());
+ }
+
+ // * ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
+ Arrays.sort(arr);
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/III/G3_2533.java b/java/BOJ/Gold/III/G3_2533.java
new file mode 100644
index 0000000..39d39d3
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_2533.java
@@ -0,0 +1,102 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2533
+ *
+ * ? ์ ๋ชฉ: ์ฌํ๋ง ์๋น์ค(SNS)
+ * ? ์๊ฐ ์ ํ: 3์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ํ์ด์ค๋ถ, ํธ์ํฐ, ์นด์นด์คํก๊ณผ ๊ฐ์ ์ฌํ๋ง ์๋น์ค(SNS)๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋จ์ ๋ฐ๋ผ, ์ฌํ๋ง์ ํตํ์ฌ ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ์๋ก์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ด๊ฒ ๋๋๊ฐ๋ฅผ ์ดํดํ๋ ๋ฌธ์ ๊ฐ ์ค์ํด์ก๋ค. ์ฌํ๋ง์์ ์ฌ๋๋ค์ ์น๊ตฌ ๊ด๊ณ๋ ๊ทธ๋ํ๋ก ํํํ ์ ์๋๋ฐ, ์ด ๊ทธ๋ํ์์ ์ฌ๋์ ์ ์ ์ผ๋ก ํํ๋๊ณ , ๋ ์ ์ ์ ์๋ ์์ง๋ ๋ ์ ์ ์ผ๋ก ํํ๋๋ ๋ ์ฌ๋์ด ์๋ก ์น๊ตฌ ๊ด๊ณ์์ ํํํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์ฒ ์์ ์ํฌ, ์ฒ ์์ ๋ง์, ์ํฌ์ ์ํฌ๊ฐ ์๋ก ์น๊ตฌ ๊ด๊ณ๋ผ๋ฉด ์ด๋ฅผ ํํํ๋ ์น๊ตฌ ๊ด๊ณ ๊ทธ๋ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+ * ์น๊ตฌ ๊ด๊ณ ๊ทธ๋ํ๋ฅผ ์ด์ฉํ๋ฉด ์ฌํ๋ง ์๋น์ค์์ ์ด๋ค ์๋ก์ด ์์ด๋์ด๊ฐ ์ ํ๋๋ ๊ณผ์ ์ ์ดํดํ๋๋ฐ ๋์์ ์ค ์ ์๋ค. ์ด๋ค ์๋ก์ด ์์ด๋์ด๋ฅผ ๋จผ์ ๋ฐ์๋ค์ธ ์ฌ๋์ ์ผ๋ฆฌ ์๋ตํฐ(early adaptor)๋ผ๊ณ ํ๋๋ฐ, ์ฌํ๋ง ์๋น์ค์ ์ํ ์ฌ๋๋ค์ ์ผ๋ฆฌ ์๋ตํฐ์ด๊ฑฐ๋ ์ผ๋ฆฌ ์๋ตํฐ๊ฐ ์๋๋ค. ์ผ๋ฆฌ ์๋ตํฐ๊ฐ ์๋ ์ฌ๋๋ค์ ์์ ์ ๋ชจ๋ ์น๊ตฌ๋ค์ด ์ผ๋ฆฌ ์๋ตํฐ์ผ ๋๋ง ์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ธ๋ค.
+ * ์ด๋ค ์์ด๋์ด๋ฅผ ์ฌํ๋ง ์๋น์ค์์ ํผ๋จ๋ฆฌ๊ณ ์ ํ ๋, ๊ฐ๋ฅํ ํ ์ต์์ ์์ ์ผ๋ฆฌ ์๋ตํฐ๋ฅผ ํ๋ณดํ์ฌ ๋ชจ๋ ์ฌ๋์ด ์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ด๊ฒ ํ๋ ๋ฌธ์ ๋ ๋งค์ฐ ์ค์ํ๋ค.
+ * ์ผ๋ฐ์ ์ธ ๊ทธ๋ํ์์ ์ด ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ต๋ค๋ ๊ฒ์ด ์๋ ค์ ธ ์๊ธฐ ๋๋ฌธ์, ์น๊ตฌ ๊ด๊ณ ๊ทธ๋ํ๊ฐ ํธ๋ฆฌ์ธ ๊ฒฝ์ฐ, ์ฆ ๋ชจ๋ ๋ ์ ์ ์ฌ์ด์ ์ด๋ค์ ์๋ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๋ง ๊ณ ๋ คํ๋ค.
+ * ์๋ฅผ ๋ค์ด, 8๋ช
์ ์ฌ๋์ผ๋ก ์ด๋ฃจ์ด์ง ๋ค์ ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ๋ฅผ ์๊ฐํด๋ณด์. 2, 3, 4๋ฒ ๋
ธ๋๊ฐ ํํํ๋ ์ฌ๋๋ค์ด ์ผ๋ฆฌ ์๋ตํฐ๋ผ๋ฉด, ์ผ๋ฆฌ ์๋ตํฐ๊ฐ ์๋ ์ฌ๋๋ค์ ์์ ์ ๋ชจ๋ ์น๊ตฌ๊ฐ ์ผ๋ฆฌ ์๋ตํฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ธ๋ค.
+ * ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ๊ฐ์ธ์ด ์๋ก์ด ์์ด๋์ด๋ฅผ ์์ฉํ๊ธฐ ์ํ์ฌ ํ์ํ ์ต์ ์ผ๋ฆฌ ์ด๋ตํฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์๋ ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ์ ์ ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. ๋จ, 2 โค N โค 1,000,000์ด๋ฉฐ, ๊ฐ ์ ์ ์ 1๋ถํฐ N๊น์ง ์ผ๋ จ๋ฒํธ๋ก ํํ๋๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ์ ์์ง (u, v)๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ u์ v๊ฐ ํ๋์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
+ *
+ * 8 -> n
+ * 1 2 -> a b
+ * 1 3 -> a b
+ * 1 4 -> a b
+ * 2 5 -> a b
+ * 2 6 -> a b
+ * 4 7 -> a b
+ * 4 8 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฃผ์ด์ง ์น๊ตฌ ๊ด๊ณ ๊ทธ๋ํ์์ ์์ด๋์ด๋ฅผ ์ ํํ๋๋ฐ ํ์ํ ์ผ๋ฆฌ ์๋ตํฐ์ ์ต์ ์๋ฅผ ํ๋์ ์ ์๋ก ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 2.168์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 427MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class G3_2533 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static ArrayList[] adj;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+ static boolean[] visit;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ findMinAdaptor(1); // * 2. ํธ๋ฆฌ DP
+ System.out.println(Math.min(dp[1][0], dp[1][1])); // * 3. ์ถ๋ ฅ
+
+ br.close();
+ }
+
+ public static void findMinAdaptor(int node) {
+ visit[node] = true;
+ dp[node][0] = 1;
+
+ for (int child : adj[node]) {
+ if (visit[child]) {
+ continue;
+ }
+
+ findMinAdaptor(child);
+ dp[node][0]+=Math.min(dp[child][1],dp[child][0]);
+ dp[node][1]+=dp[child][0];
+ }
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ visit = new boolean[n+1];
+ adj = new ArrayList[n+1];
+ dp = new int[n+1][2];
+
+ for (int i = 1; i <= n; i++) {
+ adj[i] = new ArrayList<>();
+ }
+
+ for (int i = 1; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ adj[a].add(b);
+ adj[b].add(a);
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_2629.java b/java/BOJ/Gold/III/G3_2629.java
new file mode 100644
index 0000000..5acdbee
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_2629.java
@@ -0,0 +1,159 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2629
+ *
+ * ? ์ ๋ชฉ: ์ํ์ ์ธ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ํ ์ ์ธ๊ณผ ๋ช ๊ฐ์ ์ถ๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ์ด์ฉํ์ฌ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ตฌ์ฌ์ ๋ฌด๊ฒ๋ฅผ ํ์ธํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ค๊ณ ํ๋ค.
+ * ๋ฌด๊ฒ๊ฐ ๊ฐ๊ฐ 1g๊ณผ 4g์ธ ๋ ๊ฐ์ ์ถ๊ฐ ์์ ๊ฒฝ์ฐ, ์ฃผ์ด์ง ๊ตฌ์ฌ๊ณผ 1g ์ถ ํ๋๋ฅผ ์ํ ์ ์ธ์ ์์ชฝ์ ๊ฐ๊ฐ ์ฌ๋ ค๋์ ์ํ์ ์ด๋ฃจ๋ฉด ๊ตฌ์ฌ์ ๋ฌด๊ฒ๋ 1g์ด๋ค. ๋ ๋ค๋ฅธ ๊ตฌ์ฌ์ด 4g์ธ์ง๋ฅผ ํ์ธํ๋ ค๋ฉด 1g ์ถ ๋์ 4g ์ถ๋ฅผ ์ฌ๋ ค๋์ผ๋ฉด ๋๋ค.
+ * ๊ตฌ์ฌ์ด 3g์ธ ๊ฒฝ์ฐ ์๋ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ๊ตฌ์ฌ๊ณผ ์ถ๋ฅผ ์ฌ๋ ค๋์ผ๋ฉด ์ํ ์ ์ธ์ด ์ํ์ ์ด๋ฃจ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๊ฐ 1g๊ณผ 4g์ธ ์ถ๊ฐ ํ๋์ฉ ์์ ๊ฒฝ์ฐ ์ฃผ์ด์ง ๊ตฌ์ฌ์ด 3g์ธ์ง๋ ํ์ธํด ๋ณผ ์ ์๋ค.
+ * <๊ทธ๋ฆผ 1> ๊ตฌ์ฌ์ด 3g์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ ($\boxed{1}$์ 1g์ธ ์ถ, $\boxed{4}$๋ 4g์ธ ์ถ, โ์ ๋ฌด๊ฒ๋ฅผ ํ์ธํ ๊ตฌ์ฌ)
+ * <๊ทธ๋ฆผ 2>์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฌ์ด 5g์ธ์ง๋ ํ์ธํ ์ ์๋ค. ๊ตฌ์ฌ์ด 2g์ด๋ฉด ์ฃผ์ด์ง ์ถ๋ฅผ ๊ฐ์ง๊ณ ๋ ํ์ธํ ์ ์๋ค.
+ * ์ถ๋ค์ ๋ฌด๊ฒ์ ํ์ธํ ๊ตฌ์ฌ๋ค์ ๋ฌด๊ฒ๊ฐ ์
๋ ฅ๋์์ ๋, ์ฃผ์ด์ง ์ถ๋ง์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฌ์ ๋ฌด๊ฒ๋ฅผ ํ์ธ ํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * <๊ทธ๋ฆผ 2> ๊ตฌ์ฌ์ด 5g์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์ถ์ ๊ฐ์๊ฐ ์์ฐ์๋ก ์ฃผ์ด์ง๋ค. ์ถ์ ๊ฐ์๋ 30 ์ดํ์ด๋ค. ๋์งธ ์ค์๋ ์ถ์ ๋ฌด๊ฒ๋ค์ด ์์ฐ์๋ก ๊ฐ๋ฒผ์ด ๊ฒ๋ถํฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๊ฐ์ ๋ฌด๊ฒ์ ์ถ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์๋ ์๋ค. ์ถ์ ๋ฌด๊ฒ๋ 500g์ดํ์ด๋ฉฐ, ์
๋ ฅ๋๋ ๋ฌด๊ฒ๋ค ์ฌ์ด์๋ ๋น์นธ์ด ํ๋์ฉ ์ ๋ค. ์ธ ๋ฒ์งธ ์ค์๋ ๋ฌด๊ฒ๋ฅผ ํ์ธํ๊ณ ์ ํ๋ ๊ตฌ์ฌ๋ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ํ์ธํ ๊ตฌ์ฌ์ ๊ฐ์๋ 7์ดํ์ด๋ค. ๋ค ๋ฒ์งธ ์ค์๋ ํ์ธํ๊ณ ์ ํ๋ ๊ตฌ์ฌ๋ค์ ๋ฌด๊ฒ๊ฐ ์์ฐ์๋ก ์ฃผ์ด์ง๋ฉฐ, ์
๋ ฅ๋๋ ๋ฌด๊ฒ๋ค ์ฌ์ด์๋ ๋น ์นธ์ด ํ๋์ฉ ์๋ค. ํ์ธํ๊ณ ์ ํ๋ ๊ตฌ์ฌ์ ๋ฌด๊ฒ๋ 40,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 2 -> n
+ * 1 4 -> chu[0] ~ chu[n-1]
+ * 2 -> m
+ * 3 2 -> beads.get(0) ~ beads.get(m-1)
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฃผ์ด์ง ๊ฐ ๊ตฌ์ฌ์ ๋ฌด๊ฒ์ ๋ํ์ฌ ํ์ธ์ด ๊ฐ๋ฅํ๋ฉด Y, ์๋๋ฉด N ์ ์ฐจ๋ก๋ก ์ถ๋ ฅํ๋ค. ์ถ๋ ฅ์ ํ ๊ฐ์ ์ค๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๊ฐ ๊ตฌ์ฌ์ ๋ํ ๋ต ์ฌ์ด์๋ ๋น์นธ์ ํ๋์ฉ ๋๋ค.
+ *
+ * Y N
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.152์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 32MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class G3_2629 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[] chu;
+ static ArrayList beads;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[][] visit;
+ static ArrayList[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation) - Start Case ์ค์
+ dp[0][0].add(chu[0]);
+ visit[0][chu[0]] = true;
+
+ for (int i = 1; i < n; i++) {
+ if (!visit[0][chu[i]]) {
+ visit[0][chu[i]] = true;
+ dp[0][i].add(chu[i]);
+ }
+
+ int next1 = chu[0] + chu[i];
+ int next2 = Math.abs(chu[0] - chu[i]);
+
+ if (!visit[i][next1]) {
+ visit[i][next1] = true;
+ dp[0][i].add(next1);
+ }
+
+ if (!visit[i][next2]) {
+ visit[i][next2] = true;
+ dp[0][i].add(next2);
+ }
+ }
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (i == j) {
+ dp[i][j] = dp[i-1][j];
+ continue;
+ }
+
+ for (int bead : dp[i-1][j]) {
+ dp[i][j].add(bead);
+
+ int next1 = chu[i] + bead;
+ if (!visit[j][next1]) {
+ visit[j][next1] = true;
+ dp[i][j].add(next1);
+ }
+
+ int next2 = Math.abs(chu[i] - bead);
+ if (!visit[j][next2]) {
+ visit[j][next2] = true;
+ dp[i][j].add(next2);
+ }
+ }
+ }
+ }
+
+ // * 4. ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+ for (int bead : beads) {
+ boolean able = false;
+ for (int i = 0; i < n; i++) {
+ if (visit[i][bead]) {
+ able = true;
+ break;
+ }
+ }
+
+ if (able) {
+ sb.append("Y ");
+ } else {
+ sb.append("N ");
+ }
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ chu = new int[n];
+ visit = new boolean[n][400001];
+ dp = new ArrayList[n][n];
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ dp[i][j] = new ArrayList<>();
+ }
+ }
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ chu[i] = Integer.parseInt(st.nextToken());
+ }
+
+ beads = new ArrayList<>();
+ m = Integer.parseInt(br.readLine());
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < m; i++) {
+ beads.add(Integer.parseInt(st.nextToken()));
+ }
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_7579.java b/java/BOJ/Gold/III/G3_7579.java
new file mode 100644
index 0000000..c5f4884
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_7579.java
@@ -0,0 +1,117 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/7579
+ *
+ * ? ์ ๋ชฉ: ์ฑ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ฐ๋ฆฌ๋ ์ค๋งํธํฐ์ ์ฌ์ฉํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ง ์ฑ(App)์ ์คํํ๊ฒ ๋๋ค. ๋๊ฐ์ ๊ฒฝ์ฐ ํ๋ฉด์ ๋ณด์ด๋ โ์คํ ์คโ์ธ ์ฑ์ ํ๋๋ฟ์ด์ง๋ง ๋ณด์ด์ง ์๋ ์ํ๋ก ๋ง์ ์ฑ์ด 'ํ์ฑํ'๋์ด ์๋ค. ์ฑ๋ค์ด ํ์ฑํ ๋์ด ์๋ค๋ ๊ฒ์ ํ๋ฉด์ ๋ณด์ด์ง ์๋๋ผ๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ์ํ๊ฐ ๊ธฐ๋ก๋์ด ์๋ ๊ฒ์ ๋งํ๋ค. ํ์ฌ ์คํ ์ค์ด ์๋๋๋ผ๋ ์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋๋ ์ด์ ๋ ์ฌ์ฉ์๊ฐ ์ด์ ์ ์คํํ๋ ์ฑ์ ๋ค์ ๋ถ๋ฌ์ฌ ๋์ ์ง์ ์ ์ํ๋ฅผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ฝ์ด ๋ค์ฌ ์คํ ์ค๋น๋ฅผ ๋น ๋ฅด๊ฒ ๋ง์น๊ธฐ ์ํด์์ด๋ค.
+ * ํ์ง๋ง ์ค๋งํธํฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ด๋ผ๋ ์คํํ๋ ๋ชจ๋ ์ฑ์ ํ์ฑํ๋ ์ฑ๋ก ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋๋ค ๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํ๊ฐ ์ค๊ธฐ ์ฝ๋ค. ์๋ก์ด ์ฑ์ ์คํ์ํค๊ธฐ ์ํด ํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ค๋งํธํฐ์ ์ด์์ฒด์ ๋ ํ์ฑํ ๋์ด ์๋ ์ฑ๋ค ์ค ๋ช ๊ฐ๋ฅผ ์ ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ญ์ ํ๋ ์๋ฐ์ ์๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ฑ์ โ๋นํ์ฑํโ๋ผ๊ณ ํ๋ค.
+ * ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํฉ์์ ํ์ฑํ ๋์ด ์๋ ์ฑ๋ค์ ๋ฌด์์๋ก ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋งํผ ๋นํ์ฑํ ํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค. ๋นํ์ฑํ๋ ์ฑ๋ค์ ์ฌ์คํํ ๊ฒฝ์ฐ ๊ทธ๋งํผ ์๊ฐ์ด ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ๋ฌ๋ถ์ ์ด๋ฌํ ์ฑ์ ๋นํ์ฑํ ๋ฌธ์ ๋ฅผ ์ค๋งํธํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ผ ํ๋ค
+ * ํ์ฌ N๊ฐ์ ์ฑ, A1, ..., AN์ด ํ์ฑํ ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ค ์ฑ Ai๋ ๊ฐ๊ฐ mi ๋ฐ์ดํธ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ํ, ์ฑ Ai๋ฅผ ๋นํ์ฑํํ ํ์ ๋ค์ ์คํํ๊ณ ์ ํ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๋น์ฉ(์๊ฐ ๋ฑ)์ ์์นํ ํ ๊ฒ์ ci ๋ผ๊ณ ํ์. ์ด๋ฌํ ์ํฉ์์ ์ฌ์ฉ์๊ฐ ์๋ก์ด ์ฑ B๋ฅผ ์คํํ๊ณ ์ ํ์ฌ, ์ถ๊ฐ๋ก M ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํ์. ์ฆ, ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, ..., AN ์ค์์ ๋ช ๊ฐ๋ฅผ ๋นํ์ฑํ ํ์ฌ M ๋ฐ์ดํธ ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ํ๋ณดํด์ผ ํ๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ๋ถ์ ๊ทธ ์ค์์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ ci์ ํฉ์ ์ต์ํํ์ฌ ํ์ํ ๋ฉ๋ชจ๋ฆฌ M ๋ฐ์ดํธ๋ฅผ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ 3์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ ์ค์๋ ์ ์ N๊ณผ M์ด ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ฉฐ, ๋์งธ ์ค๊ณผ ์
์งธ ์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์ ์๊ฐ ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ N๊ฐ์ ์ ์๋ ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, ..., AN์ด ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ ์์ธ m1, ..., mN์ ์๋ฏธํ๋ฉฐ, ์
์งธ ์ค์ ์ ์๋ ๊ฐ ์ฑ์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ c1, ..., cN์ ์๋ฏธํ๋ค
+ * ๋จ, 1 โค N โค 100, 1 โค M โค 10,000,000์ด๋ฉฐ, 1 โค m1, ..., mN โค 10,000,000์ ๋ง์กฑํ๋ค. ๋ํ, 0 โค c1, ..., cN โค 100์ด๊ณ , M โค m1 + m2 + ... + mN์ด๋ค.
+ *
+ * 5 60 -> n m
+ * 30 10 20 35 40 -> memory[0] ~ memory[n-1]
+ * 3 0 3 5 4 -> deAct[0] ~ deAct[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ํ์ํ ๋ฉ๋ชจ๋ฆฌ M ๋ฐ์ดํธ๋ฅผ ํ๋ณดํ๊ธฐ ์ํ ์ฑ ๋นํ์ฑํ์ ์ต์์ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ํ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ค.
+ *
+ * 6
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.868์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 57MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 5
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+class App {
+ public int memory;
+ public int deAct;
+
+ public App(int memory, int deAct) {
+ this.memory = memory;
+ this.deAct = deAct;
+ }
+}
+
+public class G3_7579 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[] memory;
+ static int[] deAct;
+ static ArrayList list = new ArrayList<>();
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = 100_000;
+ static int[] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP
+ for (int i = 0; i < list.size(); i++) {
+ App app = list.get(i);
+ for (int j = m; j >= 0; j--) {
+ if (dp[j] == max) {
+ continue;
+ }
+
+ // ๋ฉ๋ชจ๋ฆฌ๋ฅผ M๋ณด๋ค ๋ ๋ง์ด ํ๋ณดํ ์ ์๋ ๊ฒฝ์ฐ๋ Mํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ํ๋ณดํ๋ ๊ฒ์ผ๋ก ์นํ
+ if (j + app.memory > m) {
+ dp[m] = Math.min(dp[m], dp[j] + app.deAct);
+ } else {
+ dp[j+app.memory] = Math.min(dp[j+app.memory], dp[j] + app.deAct);
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(dp[m]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ memory = new int[n];
+ deAct = new int[n];
+ dp = new int[m+1];
+ Arrays.fill(dp, max);
+ dp[0] = 0;
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ memory[i] = Integer.parseInt(st.nextToken());
+ }
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ deAct[i] = Integer.parseInt(st.nextToken());
+ }
+
+ for (int i = 0; i < n; i++) {
+ list.add(new App(memory[i], deAct[i]));
+ }
+
+ list.sort((a, b) -> a.deAct - b.deAct);
+ }
+}
diff --git a/java/BOJ/Gold/III/G3_9470.java b/java/BOJ/Gold/III/G3_9470.java
new file mode 100644
index 0000000..ab81414
--- /dev/null
+++ b/java/BOJ/Gold/III/G3_9470.java
@@ -0,0 +1,129 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9470
+ *
+ * ? ์ ๋ชฉ: Strahler ์์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ง์งํ์์ ํ์ฒ๊ณ๋ ์ ํฅ๊ทธ๋ํ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ฐ์ ๊ฐ์ ์ผ๋ก ๋ํ๋ด๋ฉฐ, ๋ฌผ์ด ํ๋ฅด๋ ๋ฐฉํฅ์ด ๊ฐ์ ์ ๋ฐฉํฅ์ด ๋๋ค. ๋
ธ๋๋ ํธ์๋ ์์ฒ๋ผ ๊ฐ์ด ์์ํ๋ ๊ณณ, ๊ฐ์ด ํฉ์ณ์ง๊ฑฐ๋ ๋๋์ด์ง๋ ๊ณณ, ๋ฐ๋ค์ ๋ง๋๋ ๊ณณ์ด๋ค.*
+ * ๋ค๋ชจ ์์ ์ซ์๋ ์์๋ฅผ ๋ํ๋ด๊ณ , ๋๊ทธ๋ผ๋ฏธ ์์ ์ซ์๋ ๋
ธ๋ ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค.
+ * ํ์ฒ๊ณ์ Strahler ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
+ * ๊ฐ์ ๊ทผ์์ธ ๋
ธ๋์ ์์๋ 1์ด๋ค.
+ * ๋๋จธ์ง ๋
ธ๋๋ ๊ทธ ๋
ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์์ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ i๋ผ๊ณ ํ์ ๋, ๋ค์ด์ค๋ ๋ชจ๋ ๊ฐ ์ค์์ Strahler ์์๊ฐ i์ธ ๊ฐ์ด 1๊ฐ์ด๋ฉด ์์๋ i, 2๊ฐ ์ด์์ด๋ฉด ์์๋ i+1์ด๋ค.
+ * ํ์ฒ๊ณ์ ์์๋ ๋ฐ๋ค์ ๋ง๋๋ ๋
ธ๋์ ์์์ ๊ฐ๋ค. ๋ฐ๋ค์ ๋ง๋๋ ๋
ธ๋๋ ํญ์ 1๊ฐ์ด๋ฉฐ, ์์ ๊ทธ๋ฆผ์ Strahler ์์๋ 3์ด๋ค.
+ * ํ์ฒ๊ณ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, Strahler ์์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.*
+ * ์ค์ ๊ฐ ์ค์์ Strahler ์์๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ์๋ง์กด ๊ฐ(12)์ด๋ฉฐ, ๋ฏธ๊ตญ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ๋ ๊ฐ์ ๋ฏธ์์ํผ ๊ฐ(10)์ด๋ค.
+ * ๋
ธ๋ M์ ํญ์ ๋ฐ๋ค์ ๋ง๋๋ ๋
ธ๋์ด๋ค.
+ *
+ * ? ์
๋ ฅ * ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ์ T (1 โค T โค 1000)๊ฐ ์ฃผ์ด์ง๋ค.
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ K, M, P๊ฐ ์ฃผ์ด์ง๋ค. K๋ ํ
์คํธ ์ผ์ด์ค ๋ฒํธ, M์ ๋
ธ๋์ ์, P๋ ๊ฐ์ ์ ์์ด๋ค. (2 โค M โค 1000) ๋ค์ P๊ฐ ์ค์๋ ๊ฐ์ ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ A, B๊ฐ ์ฃผ์ด์ง๋ฉฐ, A์์ B๋ก ๋ฌผ์ด ํ๋ฅธ๋ค๋ ๋ป์ด๋ค. (1 โค A, B โค M) M์ ํญ์ ๋ฐ๋ค์ ๋ง๋๋ ๋
ธ๋์ด๋ฉฐ, ๋ฐ์ผ๋ก ํฅํ๋ ๊ฐ์ ์ ์กด์ฌํ์ง ์๋๋ค.
+ *
+ * 1 -> t
+ * 1 7 8 -> k m p
+ * 1 3 -> a b
+ * 2 3 -> a b
+ * 6 4 -> a b
+ * 3 4 -> a b
+ * 3 5 -> a b
+ * 6 7 -> a b
+ * 5 7 -> a b
+ * 4 7 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค ํ
์คํธ ์ผ์ด์ค ๋ฒํธ์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ํ์ฒ๊ณ์ Strahler ์์๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
+ *
+ * 1 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.08์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.III;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G3_9470 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int k, m, p;
+ static int[] degree;
+ static int[][] strahler;
+ static ArrayList[] list;
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine());
+ StringBuffer sb = new StringBuffer();
+ for (int c = 1; c <= t; c++) {
+ input();
+ Queue queue = new LinkedList<>();
+ for (int i = 1; i <= m; i++) {
+ if (degree[i] == 0) {
+ queue.add(i);
+ strahler[i] = new int[] {1, 1};
+ }
+ }
+
+ while (!queue.isEmpty()) {
+ int cur = queue.poll();
+
+ for (int next : list[cur]) {
+ if (strahler[next][0] == strahler[cur][0]) {
+ strahler[next][1]++;
+ } else if (strahler[next][0] < strahler[cur][0]) {
+ strahler[next] = new int[] {strahler[cur][0], 1};
+ }
+
+ if (--degree[next] == 0) {
+ if (strahler[next][1] > 1) {
+ strahler[next][0]++;
+ }
+ strahler[next][1] = 0;
+ queue.add(next);
+ }
+ };
+ }
+ sb.append(c + " " + strahler[m][0] + "\n");
+ }
+
+
+
+ bw.write(sb.toString());
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ k = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ p = Integer.parseInt(st.nextToken());
+
+ strahler = new int[m+1][2];
+ degree = new int[m+1];
+ list = new ArrayList[m+1];
+ for (int i = 1; i <= m; i++) {
+ list[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < p; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ list[a].add(b);
+ degree[b]++;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_10942.java b/java/BOJ/Gold/IV/G4_10942.java
new file mode 100644
index 0000000..0bbea25
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_10942.java
@@ -0,0 +1,117 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/10942
+ *
+ * ? ์ ๋ชฉ: ํฐ๋ฆฐ๋๋กฌ?
+ * ? ์๊ฐ ์ ํ: 2.5์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๋ช
์ฐ๋ ํ์ค์ด์ ํจ๊ป ํฐ๋ฆฐ๋๋กฌ ๋์ด๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
+ * ๋จผ์ , ํ์ค์ด๋ ์์ฐ์ N๊ฐ๋ฅผ ์น ํ์ ์ ๋๋ค. ๊ทธ ๋ค์, ๋ช
์ฐ์๊ฒ ์ง๋ฌธ์ ์ด M๋ฒ ํ๋ค.
+ * ๊ฐ ์ง๋ฌธ์ ๋ ์ ์ S์ E(1 โค S โค E โค N)๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, S๋ฒ์งธ ์๋ถํฐ E๋ฒ์งธ ๊น์ง ์๊ฐ ํฐ๋ฆฐ๋๋กฌ์ ์ด๋ฃจ๋์ง๋ฅผ ๋ฌผ์ด๋ณด๋ฉฐ, ๋ช
์ฐ๋ ๊ฐ ์ง๋ฌธ์ ๋ํด ํฐ๋ฆฐ๋๋กฌ์ด๋ค ๋๋ ์๋๋ค๋ฅผ ๋งํด์ผ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ํ์ค์ด๊ฐ ์น ํ์ ์ ์ ์๊ฐ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ ํ์.
+ *
+ * S = 1, E = 3์ธ ๊ฒฝ์ฐ 1, 2, 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
+ * S = 2, E = 5์ธ ๊ฒฝ์ฐ 2, 1, 3, 1์ ํฐ๋ฆฐ๋๋กฌ์ด ์๋๋ค.
+ * S = 3, E = 3์ธ ๊ฒฝ์ฐ 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
+ * S = 5, E = 7์ธ ๊ฒฝ์ฐ 1, 2, 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
+ * ์์ฐ์ N๊ฐ์ ์ง๋ฌธ M๊ฐ๊ฐ ๋ชจ๋ ์ฃผ์ด์ก์ ๋, ๋ช
์ฐ์ ๋๋ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์์ด์ ํฌ๊ธฐ N (1 โค N โค 2,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค์๋ ํ์ค์ด๊ฐ ์น ํ์ ์ ์ ์ N๊ฐ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์น ํ์ ์ ์ ์๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.*
+ * ์
์งธ ์ค์๋ ํ์ค์ด๊ฐ ํ ์ง๋ฌธ์ ๊ฐ์ M (1 โค M โค 1,000,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋ท์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ํ์ค์ด๊ฐ ๋ช
์ฐ์๊ฒ ํ ์ง๋ฌธ S์ E๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
+ *
+ * 7 -> n
+ * 1 2 1 3 1 2 1 -> arr[1] ~ arr[n]
+ * 4 -> t
+ * 1 3 -> s e
+ * 2 5 -> s e
+ * 3 3 -> s e
+ * 5 7 -> s e
+ *
+ * ? ์ถ๋ ฅ
+ * ์ด M๊ฐ์ ์ค์ ๊ฑธ์ณ ํ์ค์ด์ ์ง๋ฌธ์ ๋ํ ๋ช
์ฐ์ ๋ต์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์์์ ๋ฐ๋ผ์ ์ถ๋ ฅํ๋ค. ํฐ๋ฆฐ๋๋กฌ์ธ ๊ฒฝ์ฐ์๋ 1, ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ * 0
+ * 1
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.888์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 316MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G4_10942 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1];
+ dp = new int[n+1][n+1];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 1; i <= n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+
+ // * 2. DP ํ
์ด๋ธ ์ด๊ธฐํ + Start Case ์ค์
+ for (int i = 1; i <= n; i++) {
+ dp[i][i] = 1;
+ }
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int j = 1; j <= n; j++) {
+ for (int i = 1; i <= n; i++) {
+ if (i >= j) {
+ continue;
+ } else if (j - i == 1) {
+ if (arr[i] == arr[j]) {
+ dp[i][j] = 1;
+ }
+ } else {
+ if (dp[i+1][j-1] == 1 && arr[i] == arr[j]) {
+ dp[i][j] = 1;
+ }
+ }
+ }
+ }
+
+ // * 4. ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค ์ ๋ต ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+ int t = Integer.parseInt(br.readLine());
+ for (int i = 0; i < t; i++) {
+ st = new StringTokenizer(br.readLine());
+ int s = Integer.parseInt(st.nextToken());
+ int e = Integer.parseInt(st.nextToken());
+
+ sb.append(dp[s][e] + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_11054.java b/java/BOJ/Gold/IV/G4_11054.java
new file mode 100644
index 0000000..52baf05
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_11054.java
@@ -0,0 +1,116 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11054
+ *
+ * ? ์ ๋ชฉ: ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ด S๊ฐ ์ด๋ค ์ Sk๋ฅผ ๊ธฐ์ค์ผ๋ก S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN์ ๋ง์กฑํ๋ค๋ฉด, ๊ทธ ์์ด์ ๋ฐ์ดํ ๋ ์์ด์ด๋ผ๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, {10, 20, 30, 25, 20}๊ณผ {10, 20, 30, 40}, {50, 40, 25, 10} ์ ๋ฐ์ดํ ๋ ์์ด์ด์ง๋ง, {1, 2, 3, 2, 1, 2, 3, 2, 1}๊ณผ {10, 20, 30, 40, 20, 30} ์ ๋ฐ์ดํ ๋ ์์ด์ด ์๋๋ค.
+ * ์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ์์ด์ ๋ถ๋ถ ์์ด ์ค ๋ฐ์ดํ ๋ ์์ด์ด๋ฉด์ ๊ฐ์ฅ ๊ธด ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N์ด ์ฃผ์ด์ง๊ณ , ๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 โค N โค 1,000, 1 โค Ai โค 1,000)
+ *
+ * 10 -> n
+ * 1 5 2 1 4 3 4 5 2 1 -> arr[0] ~ arr[n-1] & reverseArr[n-1] ~ reverseArr[0]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ๋ถ๋ถ ์์ด ์ค์์ ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 7
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 84ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G4_11054 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+ static int[] reverseArr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] LIS;
+ static int[] REVERSE_LIS;
+ static int max = 0;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ getLIS(arr, LIS); // * 2. ์ ๋ฐฉํฅ LIS
+ getLIS(reverseArr, REVERSE_LIS); // * 3. ์ญ๋ฐฉํฅ LIS
+
+ // * 4. ๊ฐ ์ธ๋ฑ์ค ์์น์์์ ์ ,์ญ๋ฐฉํฅ LIS ๊ธธ์ด์ ๊ฐ์ ์ต๋๊ฐ ๋น๊ต
+ for (int i = 0; i < n; i++) {
+ max = Math.max(max, LIS[i] + REVERSE_LIS[n-i-1] + 1);
+ }
+
+ // * 5. ์ถ๋ ฅ
+ System.out.println(max);
+ }
+
+ // * DP(Tabulation: Bottom-Up) - LIS + Binary Search
+ public static void getLIS(int[] numList, int[] lis) {
+ int[] lisNum = new int[n];
+
+ int p = 1;
+ lisNum[0] = numList[0];
+ lis[0] = 0;
+
+ for (int i = 0; i < n; i++) {
+ if (lisNum[p-1] < numList[i]) {
+ lis[i] = p;
+ lisNum[p++] = numList[i];
+ } else {
+ int left = 0;
+ int right = p - 1;
+
+ while (left <= right) {
+ int mid = (left + right) / 2;
+
+ if (lisNum[mid] == numList[i]) {
+ left = mid;
+ break;
+ } else if (lisNum[mid] < numList[i]) {
+ left = mid + 1;
+ } else {
+ right = mid - 1;
+ }
+ }
+
+ lis[i] = left;
+ lisNum[left] = numList[i];
+ }
+ }
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ LIS = new int[n];
+ REVERSE_LIS = new int[n];
+ arr = new int[n];
+ reverseArr = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ reverseArr[n-i-1] = arr[i];
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_12869.java b/java/BOJ/Gold/IV/G4_12869.java
new file mode 100644
index 0000000..ad74844
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_12869.java
@@ -0,0 +1,146 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/12869
+ *
+ * ? ์ ๋ชฉ: ๋ฎคํ๋ฆฌ์คํฌ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์๋น์ด๋ ๊ฐํธ์ ํจ๊ป ์คํํฌ๋ํํธ ๊ฒ์์ ํ๊ณ ์๋ค. ์๋น์ด๋ ๋ฎคํ๋ฆฌ์คํฌ 1๊ฐ๊ฐ ๋จ์์๊ณ , ๊ฐํธ๋ SCV N๊ฐ๊ฐ ๋จ์์๋ค.
+ * ๊ฐ๊ฐ์ SCV๋ ๋จ์์๋ ์ฒด๋ ฅ์ด ์ฃผ์ด์ ธ์์ผ๋ฉฐ, ๋ฎคํ๋ฆฌ์คํฌ๋ฅผ ๊ณต๊ฒฉํ ์๋ ์๋ค. ์ฆ, ์ด ๊ฒ์์ ์๋น์ด๊ฐ ์ด๊ฒผ๋ค๋ ๊ฒ์ด๋ค.
+ * ๋ฎคํ๋ฆฌ์คํฌ๊ฐ ๊ณต๊ฒฉ์ ํ ๋, ํ ๋ฒ์ ์ธ ๊ฐ์ SCV๋ฅผ ๊ณต๊ฒฉํ ์ ์๋ค.
+ *
+ * ์ฒซ ๋ฒ์งธ๋ก ๊ณต๊ฒฉ๋ฐ๋ SCV๋ ์ฒด๋ ฅ 9๋ฅผ ์๋๋ค.
+ * ๋ ๋ฒ์งธ๋ก ๊ณต๊ฒฉ๋ฐ๋ SCV๋ ์ฒด๋ ฅ 3์ ์๋๋ค.
+ * ์ธ ๋ฒ์งธ๋ก ๊ณต๊ฒฉ๋ฐ๋ SCV๋ ์ฒด๋ ฅ 1์ ์๋๋ค.
+ *
+ * SCV์ ์ฒด๋ ฅ์ด 0 ๋๋ ๊ทธ ์ดํ๊ฐ ๋์ด๋ฒ๋ฆฌ๋ฉด, SCV๋ ๊ทธ ์ฆ์ ํ๊ดด๋๋ค. ํ ๋ฒ์ ๊ณต๊ฒฉ์์ ๊ฐ์ SCV๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ณต๊ฒฉํ ์๋ ์๋ค.
+ * ๋จ์์๋ SCV์ ์ฒด๋ ฅ์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋ SCV๋ฅผ ํ๊ดดํ๊ธฐ ์ํด ๊ณต๊ฒฉํด์ผ ํ๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ SCV์ ์ N (1 โค N โค 3)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ SCV N๊ฐ์ ์ฒด๋ ฅ์ด ์ฃผ์ด์ง๋ค. ์ฒด๋ ฅ์ 60๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 3 -> n
+ * 12 10 4 -> arr[0] arr[1] arr[2]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ชจ๋ SCV๋ฅผ ํ๊ดดํ๊ธฐ ์ํ ๊ณต๊ฒฉ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.088์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_12869 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, answer;
+ static int[] arr;
+
+ // * ๋ฎคํ๋ฆฌ์คํฌ ๊ณต๊ฒฉ ์์ ๊ฒฝ์ฐ
+ static int[] dx = {9, 3, 1, 9, 3, 1};
+ static int[] dy = {3, 9, 3, 1, 1, 9};
+ static int[] dz = {1, 1, 9, 3, 9, 3};
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2-1. n = 1์ผ ๋
+ if (n == 1) {
+ answer = arr[0] % 9 == 0 ? arr[0] / 9 : arr[0] / 9 + 1;
+ }
+
+ // * 2-2. n = 2์ผ ๋: BFS
+ else if (n == 2) {
+ int[][] dp = new int[61][61];
+ dp[arr[0]][arr[1]] = 1;
+
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {arr[0], arr[1]});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == 0 && cur[1] == 0) {
+ answer = dp[0][0] - 1;
+ }
+
+ for (int i = 0; i < 2; i++) {
+ int nx = cur[0] - dx[i];
+ int ny = cur[1] - dy[i];
+
+ nx = Math.max(nx, 0);
+ ny = Math.max(ny, 0);
+
+ if (dp[nx][ny] == 0) {
+ dp[nx][ny] = dp[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {nx, ny});
+ }
+
+ }
+ }
+ }
+
+ // * 2-3. n = 3์ผ ๋: BFS
+ else {
+ int[][][] dp = new int[61][61][61];
+ dp[arr[0]][arr[1]][arr[2]] = 1;
+
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {arr[0], arr[1], arr[2]});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == 0 && cur[1] == 0 && cur[2] == 0) {
+ answer = dp[0][0][0] - 1;
+ }
+
+ for (int i = 0; i < 6; i++) {
+ int nx = cur[0] - dx[i];
+ int ny = cur[1] - dy[i];
+ int nz = cur[2] - dz[i];
+
+ nx = Math.max(nx, 0);
+ ny = Math.max(ny, 0);
+ nz = Math.max(nz, 0);
+
+ if (dp[nx][ny][nz] == 0) {
+ dp[nx][ny][nz] = dp[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[] {nx, ny, nz});
+ }
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(answer);
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ arr[n] = 0;
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_12886.java b/java/BOJ/Gold/IV/G4_12886.java
new file mode 100644
index 0000000..2a68852
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_12886.java
@@ -0,0 +1,89 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/12886
+ *
+ * ? ์ ๋ชฉ: ๋ ๊ทธ๋ฃน
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ค๋ ๊ฐํธ๋ ๋์ ์ด์ฉํด ์ฌ๋ฏธ์๋ ๊ฒ์์ ํ๋ ค๊ณ ํ๋ค. ๋จผ์ , ๋์ ์ธ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ๊ทธ๋ฃน์๋ ๋์ด A, B, C๊ฐ๊ฐ ์๋ค. ๊ฐํธ๋ ๋ชจ๋ ๊ทธ๋ฃน์ ์๋ ๋์ ๊ฐ์๋ฅผ ๊ฐ๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ๊ฐํธ๋ ๋์ ๋จ๊ณ๋ณ๋ก ์์ง์ด๋ฉฐ, ๊ฐ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด์ ธ ์๋ค.
+ * ํฌ๊ธฐ๊ฐ ๊ฐ์ง ์์ ๋ ๊ทธ๋ฃน์ ๊ณ ๋ฅธ๋ค. ๊ทธ ๋ค์, ๋์ ๊ฐ์๊ฐ ์์ ์ชฝ์ X, ํฐ ์ชฝ์ Y๋ผ๊ณ ์ ํ๋ค. ๊ทธ ๋ค์, X์ ์๋ ๋์ ๊ฐ์๋ฅผ X+X๊ฐ๋ก, Y์ ์๋ ๋์ ๊ฐ์๋ฅผ Y-X๊ฐ๋ก ๋ง๋ ๋ค.
+ * A, B, C๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐํธ๊ฐ ๋์ ๊ฐ์ ๊ฐ์๋ก ๋ง๋ค ์ ์์ผ๋ฉด 1์, ์๋๋ฉด 0์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค. (1 โค A, B, C โค 500)
+ *
+ * 10 15 36 -> A B C
+ *
+ * ? ์ถ๋ ฅ
+ * ๋์ ๊ฐ์ ๊ฐ์๋ก ๋ง๋ค ์ ์์ผ๋ฉด 1์, ์๋๋ฉด 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.288์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 94MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_12886 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int A, B, C;
+ static int[][] dir = {{1, 2}, {0, 2}, {0, 1}};
+
+ public static void main(String[] args) throws IOException {
+ input();
+ System.out.println(bfs());
+ }
+
+ public static int bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {A, B, C});
+ boolean[][] visit = new boolean[1501][1501];
+ visit[A][B] = true;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == cur[1] && cur[1] == cur[2]) {
+ return 1;
+ }
+
+ for (int i = 0; i < 3; i++) {
+ if (cur[dir[i][0]] != cur[dir[i][1]]) {
+ int[] next = new int[3];
+ next[i] = cur[i];
+
+ next[dir[i][0]] = cur[dir[i][0]] > cur[dir[i][1]] ? cur[dir[i][0]] - cur[dir[i][1]] : 2 * cur[dir[i][0]];
+ next[dir[i][1]] = cur[dir[i][1]] > cur[dir[i][0]] ? cur[dir[i][1]] - cur[dir[i][0]] : 2 * cur[dir[i][1]];
+
+ if (!visit[next[dir[i][0]]][next[dir[i][1]]]) {
+ visit[next[dir[i][0]]][next[dir[i][1]]] = true;
+ queue.add(next);
+ }
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ A = Integer.parseInt(st.nextToken());
+ B = Integer.parseInt(st.nextToken());
+ C = Integer.parseInt(st.nextToken());
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_13424.java b/java/BOJ/Gold/IV/G4_13424.java
new file mode 100644
index 0000000..2d12b2d
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_13424.java
@@ -0,0 +1,102 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/13424
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G4_13424 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, m, k;
+ static int answer;
+ static int[][] adj;
+ static int[] friend;
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine());
+ StringBuffer sb = new StringBuffer();
+
+ for (int testcase = 0; testcase < t; testcase++) {
+ input();
+ floyd();
+
+ int min = Integer.MAX_VALUE;
+ for (int i = 1; i <= n; i++) {
+ int sum = 0;
+ for (int f : friend) {
+ sum += adj[f][i];
+ }
+
+ if (min > sum) {
+ min = sum;
+ answer = i;
+ } else if (min == sum) {
+ answer = Math.min(answer, i);
+ }
+ }
+
+ sb.append(answer + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void floyd() {
+ for (int k = 1; k <= n; k++) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (k == i || i == j) {
+ continue;
+ }
+
+ if (adj[i][j] > adj[i][k] + adj[k][j]) {
+ adj[i][j] = adj[i][k] + adj[k][j];
+ }
+ }
+ }
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ adj = new int[n+1][n+1];
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (i == j) {
+ adj[i][j] = 0;
+ } else {
+ adj[i][j] = 1_000_000;
+ }
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ adj[a][b] = Math.min(adj[a][b], c);
+ adj[b][a] = Math.min(adj[b][a], c);
+ }
+
+ k = Integer.parseInt(br.readLine());
+ friend = new int[k];
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < k; i++) {
+ friend[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_14002.java b/java/BOJ/Gold/IV/G4_14002.java
new file mode 100644
index 0000000..99b0997
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_14002.java
@@ -0,0 +1,125 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14002
+ *
+ * ? ์ ๋ชฉ: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 4
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 โค N โค 1,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 โค Ai โค 1,000)
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ๋์งธ ์ค์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ค. ๊ทธ๋ฌํ ์์ด์ด ์ฌ๋ฌ๊ฐ์ง์ธ ๊ฒฝ์ฐ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๋ค.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.08์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G4_14002 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] dp;
+ static int[] index;
+ static int[] lis;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ LIS(); // * 2. DP(Tabulation: Bottom-Up): LIS
+ getLIS(); // * 3. LIS ๋ฐฐ์ด ์ฐพ๊ธฐ
+
+ // * 4. ์ถ๋ ฅ
+ bw.write(String.valueOf(lis.length) + "\n");
+ for (int i = 0; i < lis.length; i++) {
+ bw.write(String.valueOf(lis[i]) + " ");
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ st = new StringTokenizer(br.readLine());
+
+ arr = new int[n];
+ dp = new int[n];
+ index = new int[n];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+
+ // LIS
+ public static void LIS() {
+ int p = 1;
+ dp[0] = arr[0];
+ index[0] = 0;
+
+ for (int i = 0; i < n; i++) {
+ if (dp[p-1] < arr[i]) {
+ index[i] = p;
+ dp[p++] = arr[i];
+ } else {
+ int left = 0;
+ int right = p-1;
+
+ while (left <= right) {
+ int mid = (left + right) / 2;
+
+ if (dp[mid] == arr[i]) {
+ left = mid;
+ break;
+ }
+
+ if (dp[mid] > arr[i]) {
+ right = mid-1;
+ } else {
+ left = mid+1;
+ }
+ }
+
+ dp[left] = arr[i];
+ index[i] = left;
+ }
+ }
+
+ lis = new int[p]; // LIS ๋ฐฐ์ด ํฌ๊ธฐ ์ค์
+ }
+
+ // LIS ๋ฐฐ์ด ์ฐพ๊ธฐ
+ public static void getLIS() {
+ int p = lis.length - 1;
+ int idx = n-1;
+
+ while (idx >= 0) {
+ if (index[idx] == p) {
+ lis[p--] = arr[idx];
+ }
+ idx--;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_14267.java b/java/BOJ/Gold/IV/G4_14267.java
new file mode 100644
index 0000000..140933c
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_14267.java
@@ -0,0 +1,97 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14267
+ *
+ * ? ์ ๋ชฉ: ํ์ฌ ๋ฌธํ 1
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์์ ํ์ฌ์๋ ๋งค์ฐ ์ข์ ๋ฌธํ๊ฐ ์๋๋ฐ, ๋ฐ๋ก ์์ฌ๊ฐ ์ง์ ๋ถํ๋ฅผ ์นญ์ฐฌํ๋ฉด ๊ทธ ๋ถํ๊ฐ ๋ถํ์ ์ง์ ๋ถํ๋ฅผ ์ฐ์์ ์ผ๋ก ์นญ์ฐฌํ๋ ๋ด๋ฆฌ ์นญ์ฐฌ์ด ์๋ค. ์ฆ, ์์ฌ๊ฐ ํ ์ง์ ๋ถํ๋ฅผ ์นญ์ฐฌํ๋ฉด ๊ทธ ๋ถํ์ ๋ชจ๋ ๋ถํ๋ค์ด ์นญ์ฐฌ์ ๋ฐ๋๋ค.
+ * ๋ชจ๋ ์นญ์ฐฌ์๋ ์นญ์ฐฌ์ ์ ๋๋ฅผ ์๋ฏธํ๋ ์์น๊ฐ ์๋๋ฐ, ์ด ์์น ๋ํ ๋ถํ๋ค์๊ฒ ๋๊ฐ์ด ์นญ์ฐฌ ๋ฐ๋๋ค.
+ * ์ง์ ์์ฌ์ ์ง์ ๋ถํ๊ด๊ณ์ ๋ํด ์ฃผ์ด์ง๊ณ , ์นญ์ฐฌ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋, ๊ฐ์ ์ผ๋ง์ ์นญ์ฐฌ์ ๋ฐ์๋์ง ์ถ๋ ฅํ์์ค,
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ํ์ฌ์ ์ง์ ์ n๋ช
, ์ต์ด์ ์นญ์ฐฌ์ ํ์ m์ด ์ฃผ์ด์ง๋ค. ์ง์์ 1๋ฒ๋ถํฐ n๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. (2 โค n, m โค 100,000)
+ * ๋์งธ ์ค์๋ ์ง์ n๋ช
์ ์ง์ ์์ฌ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ง์ ์์ฌ์ ๋ฒํธ๋ ์์ ์ ๋ฒํธ๋ณด๋ค ์์ผ๋ฉฐ, ์ต์ข
์ ์ผ๋ก 1๋ฒ์ด ์ฌ์ฅ์ด๋ค. 1๋ฒ์ ๊ฒฝ์ฐ, ์์ฌ๊ฐ ์์ผ๋ฏ๋ก -1์ด ์
๋ ฅ๋๋ค.
+ * ๋ค์ m์ค์๋ ์ง์ ์์ฌ๋ก๋ถํฐ ์นญ์ฐฌ์ ๋ฐ์ ์ง์ ๋ฒํธ i, ์นญ์ฐฌ์ ์์น w๊ฐ ์ฃผ์ด์ง๋ค. (2 โค i โค n, 1 โค w โค 1,000)
+ * ์ฌ์ฅ์ ์์ฌ๊ฐ ์์ผ๋ฏ๋ก ์นญ์ฐฌ์ ๋ฐ์ง ์๋๋ค.
+ *
+ * 5 3 -> n m
+ * -1 1 2 3 4 -> arr[1] ~ arr[n]
+ * 2 2 -> sub p
+ * 3 4 -> sub p
+ * 5 6 -> sub p
+ *
+ * ? ์ถ๋ ฅ
+ * 1๋ฒ๋ถํฐ n๋ฒ์ ์ง์๊น์ง ์นญ์ฐฌ์ ๋ฐ์ ์ ๋๋ฅผ ์ถ๋ ฅํ์์ค.
+ *
+ * 0 2 6 6 12
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.54์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 65MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.*;
+
+public class G4_14267 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] point;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int sub = Integer.parseInt(st.nextToken());
+ int p = Integer.parseInt(st.nextToken());
+ point[sub] += p; // ์์ ํฌ์ธํธ ํ์ฑํ
+ }
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 2; i <= n; i++) {
+ point[i] += point[arr[i]];
+ }
+
+ // * 3. ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+ for (int i = 1; i <= n; i++) {
+ sb.append(point[i] + " ");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n+1];
+ point = new int[n+1];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 1; i <= n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+
+}
diff --git a/java/BOJ/Gold/IV/G4_14466.java b/java/BOJ/Gold/IV/G4_14466.java
new file mode 100644
index 0000000..7d9805a
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_14466.java
@@ -0,0 +1,118 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14466
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_14466 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, k, r;
+ static ArrayList[][] farm;
+ static int[][] arr;
+ static ArrayList cows;
+ static boolean[][] visit;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+ StringBuffer sb = new StringBuffer();
+
+ int sum = 0;
+ for (int[] cow : cows) {
+ sum += bfs(cow);
+ }
+
+ System.out.println(sum / 2);
+ }
+
+ public static int bfs(int[] cow) {
+ int count = 0;
+ Queue queue = new LinkedList<>();
+ visit = new boolean[n+1][n+1];
+ visit[cow[0]][cow[1]] = true;
+ queue.add(cow);
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx <= 0 || ny <= 0 || nx > n || ny > n || visit[nx][ny]) {
+ continue;
+ }
+
+ boolean needRoad = false;
+ for (int[] road : farm[cur[0]][cur[1]]) {
+ if (road[0] == nx && road[1] == ny) {
+ needRoad = true;
+ }
+ }
+
+ if (needRoad) {
+ continue;
+ }
+
+ if (arr[nx][ny] == 1) {
+ count++;
+ }
+
+ visit[nx][ny] = true;
+ queue.add(new int[] {nx, ny});
+ }
+ }
+
+ return k - count - 1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+ r = Integer.parseInt(st.nextToken());
+
+ arr = new int[n+1][n+1];
+ farm = new ArrayList[n+1][n+1];
+ visit = new boolean[n+1][n+1];
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ farm[i][j] = new ArrayList<>();
+ }
+ }
+
+ for (int i = 0; i < r; i++) {
+ st = new StringTokenizer(br.readLine());
+ int r1 = Integer.parseInt(st.nextToken());
+ int c1 = Integer.parseInt(st.nextToken());
+ int r2 = Integer.parseInt(st.nextToken());
+ int c2 = Integer.parseInt(st.nextToken());
+
+ farm[r1][c1].add(new int[] {r2, c2});
+ farm[r2][c2].add(new int[] {r1, c1});
+ }
+
+ cows = new ArrayList<>();
+ for (int i = 0; i < k; i++) {
+ st = new StringTokenizer(br.readLine());
+ int r = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ arr[r][c] = 1;
+
+ cows.add(new int[] {r, c});
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_14500.java b/java/BOJ/Gold/IV/G4_14500.java
new file mode 100644
index 0000000..946f2ab
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_14500.java
@@ -0,0 +1,146 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/14500
+ *
+ * ! ์ ๋ชฉ: ํ
ํธ๋ก๋ฏธ๋
ธ
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ํด๋ฆฌ์ค๋ฏธ๋
ธ๋ ํฌ๊ธฐ๊ฐ 1ร1์ธ ์ ์ฌ๊ฐํ์ ์ฌ๋ฌ ๊ฐ ์ด์ด์ ๋ถ์ธ ๋ํ์ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
+ * ์ ์ฌ๊ฐํ์ ์๋ก ๊ฒน์น๋ฉด ์ ๋๋ค.
+ * ๋ํ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค.
+ * ์ ์ฌ๊ฐํ์ ๋ณ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ์ฆ, ๊ผญ์ง์ ๊ณผ ๊ผญ์ง์ ๋ง ๋ง๋ฟ์ ์์ผ๋ฉด ์ ๋๋ค.
+ * ์ ์ฌ๊ฐํ 4๊ฐ๋ฅผ ์ด์ด ๋ถ์ธ ํด๋ฆฌ์ค๋ฏธ๋
ธ๋ ํ
ํธ๋ก๋ฏธ๋
ธ๋ผ๊ณ ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง๊ฐ ์๋ค.
+ * ์๋ฆ์ด๋ ํฌ๊ธฐ๊ฐ NรM์ธ ์ข
์ด ์์ ํ
ํธ๋ก๋ฏธ๋
ธ ํ๋๋ฅผ ๋์ผ๋ ค๊ณ ํ๋ค. ์ข
์ด๋ 1ร1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ์นธ์๋ ์ ์๊ฐ ํ๋ ์ฐ์ฌ ์๋ค.
+ * ํ
ํธ๋ก๋ฏธ๋
ธ ํ๋๋ฅผ ์ ์ ํ ๋์์ ํ
ํธ๋ก๋ฏธ๋
ธ๊ฐ ๋์ธ ์นธ์ ์ฐ์ฌ ์๋ ์๋ค์ ํฉ์ ์ต๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ํ
ํธ๋ก๋ฏธ๋
ธ๋ ๋ฐ๋์ ํ ์ ์ฌ๊ฐํ์ด ์ ํํ ํ๋์ ์นธ์ ํฌํจํ๋๋ก ๋์์ผ ํ๋ฉฐ, ํ์ ์ด๋ ๋์นญ์ ์์ผ๋ ๋๋ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ข
์ด์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (4 โค N, M โค 500)
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ข
์ด์ ์ฐ์ฌ ์๋ ์๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ j๋ฒ์งธ ์๋ ์์์๋ถํฐ i๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ j๋ฒ์งธ ์นธ์ ์ฐ์ฌ ์๋ ์์ด๋ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์๋ 1,000์ ๋์ง ์๋ ์์ฐ์์ด๋ค.
+ *
+ * 5 5 -> n m
+ * 1 2 3 4 5 -> arr[0][0] ~ arr[0][m-1]
+ * 5 4 3 2 1
+ * 2 3 4 5 6
+ * 6 5 4 3 2
+ * 1 2 1 2 1 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํ
ํธ๋ก๋ฏธ๋
ธ๊ฐ ๋์ธ ์นธ์ ์ฐ์ธ ์๋ค์ ํฉ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 19
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 616ms
+ * ๋ฉ๋ชจ๋ฆฌ: 31684KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G4_14500 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, m;
+ static int[][] arr;
+
+ // ์ด๊ธฐ ์ค์
+ static int max = 0;
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+ static boolean[][] visited;
+
+ // * ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ๋ฐ๊ธฐ
+
+ // * ๋ชจ๋ ์์น์์ DFS์ํ
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ // * DFS ์ํ ํ ๋ฐฉ๋ฌธ ํ์ ํด์
+ visited[i][j] = true;
+ dfs(i, j, 1, arr[i][j]);
+ visited[i][j] = false;
+
+ // * DFS๋ก ๊ตฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ณ์ฐ
+ // * 'ใ
' 'ใ
' 'ใ
' 'ใ
' ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ๋ง ์๊ฐํ์ฌ ๊ณ์ฐ
+ int count = 1;
+ int min = 1000;
+ int sum = arr[i][j];
+
+ for (int k = 0; k < 4; k++) {
+ int ni = i + dx[k];
+ int nj = j + dy[k];
+
+ if (0 <= ni && ni < n && 0 <= nj && nj < m) {
+ count++;
+ sum += arr[ni][nj];
+ min = Math.min(arr[ni][nj], min);
+ }
+ }
+
+ // * ์ ๋ค๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ: ์ํ์ข์ฐ๊ฐ ์ค ์ต์๊ฐ์ ๋นผ์ 4๊ฐ๋ธ๋ญ์ ํฉ์ ์ต๋๊ฐ๋ง ์ทจ๊ธํ์ฌ max๊ฐ๊ณผ ๋น๊ตํ์ฌ ์
๋ฐ์ดํธ
+ if (count == 5) {
+ max = Math.max(sum - min, max);
+ } else if (count == 4) {
+ // * ์ ๋ค๊ฐ์ง ๊ฒฝ์ฐ ์ค ํ๊ฐ์ง๋ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ: max๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ฐ๋ก ์
๋ฐ์ดํธ
+ max = Math.max(sum, max);
+ }
+ }
+ }
+
+ bw.write(String.valueOf(max)); // * ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! DFS
+ public static void dfs(int x, int y, int count, int sum) {
+ // * 4๋ฒ์ ์ด๋์ด ๋๋ฌ๋ค๋ฉด ์ข
๋ฃ
+ if (count == 4) {
+ max = Math.max(sum, max);
+ return;
+ }
+
+ // * ์ํ์ข์ฐ์ ๋ํ์ฌ DFS ์ฌ๊ท ์ํ
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ // * ๋ฒ์์ฒดํฌ + ๋ฐฉ๋ฌธ์ฒดํฌ
+ if (0 <= nx && nx < n && 0 <= ny && ny < m && !visited[nx][ny]) {
+ // * DFS๊ฐ ์๋ฃ๋๋ฉด ๋ฐฉ๋ฌธํ์ ํด์
+ visited[nx][ny] = true;
+ dfs(nx, ny, count+1, sum + arr[nx][ny]);
+ visited[nx][ny] = false;
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][m];
+ visited = new boolean[n][m];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_14923.java b/java/BOJ/Gold/IV/G4_14923.java
new file mode 100644
index 0000000..099f718
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_14923.java
@@ -0,0 +1,133 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14923
+ *
+ * ? ์ ๋ชฉ: ๋ฏธ๋ก ํ์ถ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ํ์ต์ด๋ ์ฌ์
ํ ๋ง๋ฒ์ฌ์ ๊พ์ ์์ N x M ๋ฏธ๋ก (Hx, Hy) ์์น์ ๋จ์ด์ก๋ค. ๋คํํ๋ ํ์ต์ด๋ ๋ง๋ฒ์ฌ๊ฐ ๋ง๋ ๋ฏธ๋ก์ ํ์ถ ์์น(Ex, Ey)๋ฅผ ์๊ณ ์๋ค. ํ์ง๋ง ๋ฏธ๋ก์๋ ๊ณณ๊ณณ์ ๋ง๋ฒ์ฌ๊ฐ ์ค์นํ ๋ฒฝ์ด ์์ด ํ์ต์ด๊ฐ ํ์ถํ๊ธฐ ์ด๋ ต๊ฒ ํ๊ณ ์๋ค.
+ * ํ์ต์ด๋ ๋ง๋ฒ์ฌ์ ์ฐ๊ตฌ์ค์์ ํ์น ์งํก์ด๊ฐ ์์ด, ๋ฒฝ์ ๊ธธ๋ก ๋ง๋ค ์ ์๋ค. ๊ทธ๋ ์ง๋ง, ์ํ๊น๊ฒ๋ ๋ง๋ฒ์ ์งํก์ด๋ ๋จ ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์๋ค.
+ * ์ด๋, ํ์ต์ด๋ฅผ ๋์ ๋ฏธ๋ก์์ ํ์ถํ ์ ์๋์ง ์์๋ณด๊ณ , ํ ์ ์๋ค๋ฉด ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ D๋ ์ผ๋ง์ธ์ง ์์๋ณด์.
+ * ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํ๋๋ฐ ๋๊ฐ์ ์๊ฐ์ด ๋ค๊ณ , ๋ฒฝ์ ๋ถ์๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * < ์
๋ ฅ ์ค๋ช
>
+ * N M
+ * Hx Hy
+ * Ex Ey
+ * N X M ํ๋ ฌ
+ *
+ * 2 โค N โค 1000, 2 โค M โค 1000
+ * 1 โค Hx, Hy, Ex, Ey โค 1000
+ * (Hx, Hy)โ (Ex, Ey)
+ * ํ๋ ฌ์ 0๊ณผ 1๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๊ณ , 0์ด ๋น ์นธ, 1์ด ๋ฒฝ์ด๋ค.
+ *
+ * 5 6 -> n m
+ * 1 1 -> start[0], start[1]
+ * 5 6 -> end[0], end[1]
+ * 0 1 1 1 0 0 -> arr[0][0] ~ arr[0][m-1]
+ * 0 1 1 0 0 0
+ * 0 1 0 0 1 0
+ * 0 1 0 0 1 0
+ * 0 0 0 1 1 0 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * D (ํ์ถ ํ ์ ์๋ค๋ฉด, -1์ ์ถ๋ ฅํ๋ค.)
+ *
+ * 11
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.696์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 118MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_14923 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m;
+ static int[][] arr;
+ static int[] start;
+ static int[] end;
+ static int[][][] visit;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int answer = bfs();
+ System.out.println(answer);
+ }
+
+ public static int bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[]{start[0], start[1], 1});
+ visit[start[0]][start[1]][1] = 1;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == end[0] && cur[1] == end[1]) {
+ return visit[end[0]][end[1]][cur[2]] - 1;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ continue;
+ }
+
+ if (arr[nx][ny] == 1 && cur[2] == 1) {
+ if (visit[nx][ny][0] == 0) {
+ visit[nx][ny][0] = visit[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[]{nx, ny, 0});
+ }
+
+ } else if (arr[nx][ny] == 0) {
+ if (visit[nx][ny][cur[2]] == 0) {
+ visit[nx][ny][cur[2]] = visit[cur[0]][cur[1]][cur[2]] + 1;
+ queue.add(new int[]{nx, ny, cur[2]});
+ }
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ st = new StringTokenizer(br.readLine());
+ start = new int[]{Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()) - 1};
+
+ st = new StringTokenizer(br.readLine());
+ end = new int[]{Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()) - 1};
+
+ arr = new int[n][m];
+ visit = new int[n][m][2];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_16197.java b/java/BOJ/Gold/IV/G4_16197.java
new file mode 100644
index 0000000..74a3f0b
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_16197.java
@@ -0,0 +1,168 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/16197
+ *
+ * ! ์ ๋ชฉ: ๋ ๋์
+ * ! ์๊ฐ ์ ํ: 2์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * NรM ํฌ๊ธฐ์ ๋ณด๋์ 4๊ฐ์ ๋ฒํผ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์์ด ์๋ค. ๋ณด๋๋ 1ร1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๊ฐ๊ฐ์ ์นธ์ ๋น์ด์๊ฑฐ๋, ๋ฒฝ์ด๋ค. ๋ ๊ฐ์ ๋น ์นธ์๋ ๋์ ์ด ํ๋์ฉ ๋์ฌ์ ธ ์๊ณ , ๋ ๋์ ์ ์์น๋ ๋ค๋ฅด๋ค.
+ * ๋ฒํผ์ "์ผ์ชฝ", "์ค๋ฅธ์ชฝ", "์", "์๋"์ ๊ฐ์ด 4๊ฐ์ง๊ฐ ์๋ค. ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ ๋์ ์ด ๋ฒํผ์ ์ฐ์ฌ ์๋ ๋ฐฉํฅ์ผ๋ก ๋์์ ์ด๋ํ๊ฒ ๋๋ค.
+ * ๋์ ์ด ์ด๋ํ๋ ค๋ ์นธ์ด ๋ฒฝ์ด๋ฉด, ๋์ ์ ์ด๋ํ์ง ์๋๋ค.
+ * ๋์ ์ด ์ด๋ํ๋ ค๋ ๋ฐฉํฅ์ ์นธ์ด ์์ผ๋ฉด ๋์ ์ ๋ณด๋ ๋ฐ๊นฅ์ผ๋ก ๋จ์ด์ง๋ค.
+ * ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์ด๋ํ๋ ค๋ ๋ฐฉํฅ์ผ๋ก ํ ์นธ ์ด๋ํ๋ค.์ด๋ํ๋ ค๋ ์นธ์ ๋์ ์ด ์๋ ๊ฒฝ์ฐ์๋ ํ ์นธ ์ด๋ํ๋ค.
+ * ๋ ๋์ ์ค ํ๋๋ง ๋ณด๋์์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ์ํด ๋ฒํผ์ ์ต์ ๋ช ๋ฒ ๋๋ฌ์ผํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (1 โค N, M โค 20)
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * o: ๋์
+ * .: ๋น ์นธ
+ * #: ๋ฒฝ
+ * ๋์ ์ ๊ฐ์๋ ํญ์ 2๊ฐ์ด๋ค.
+ *
+ * 6 2 -> n m
+ * .# -> arr[0][0] ~ arr[0][m-1]
+ * .#
+ * .#
+ * o#
+ * o#
+ * ## -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ ๋์ ์ค ํ๋๋ง ๋ณด๋์์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ์ํด ๋๋ฌ์ผ ํ๋ ๋ฒํผ์ ์ต์ ํ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ, ๋ ๋์ ์ ๋จ์ด๋จ๋ฆด ์ ์๊ฑฐ๋, ๋ฒํผ์ 10๋ฒ๋ณด๋ค ๋ง์ด ๋๋ฌ์ผ ํ๋ค๋ฉด, -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 80ms
+ * ๋ฉ๋ชจ๋ฆฌ: 11868KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.*;
+
+public class G4_16197 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ private static int n, m;
+ private static char[][] arr;
+
+ // ์ด๊ธฐ ์ค์
+ static int answer = -1; // ์ ๋ต
+ static int[] dx = {1, -1, 0, 0}; // ์ํ
+ static int[] dy = {0, 0, 1, -1}; // ์ข์ฐ
+ static int[][] coin = new int[2][2]; // ์ด๊ธฐ ๋์ ์ ์์น
+
+ // * ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+
+ // TODO: ์ด 4๊ฐ์ง ๋จ๊ณ ํ์ด
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ findCoin(); // * ์ด๊ธฐ ๋์ ์ ์์น ์ฐพ๊ธฐ
+ bfs(); // * BFS ์ํ
+ bw.write(String.valueOf(answer)); // * ์ ๋ต ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static void bfs() {
+ LinkedList queue = new LinkedList<>(); // * BFS์ฉ queue
+ boolean[][][][] visited = new boolean[n][m][n][m]; // * 20 x 20 x 20 x 20 4์ฐจ์ ๋ฐฉ๋ฌธํ์ ๋ฐฐ์ด(16๋ง์ boolean ๊ฐ๋ฅ)
+
+ visited[coin[0][0]][coin[0][1]][coin[1][0]][coin[1][1]] = true;
+ queue.add(new int[] {coin[0][0], coin[0][1], coin[1][0], coin[1][1], 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+ int x1 = cur[0];
+ int y1 = cur[1];
+ int x2 = cur[2];
+ int y2 = cur[3];
+ int count = cur[4];
+
+ if (count >= 10) continue; // * 10๋ฒ์ ๋๊ฒ ์ด๋ํ ๊ฒฝ์ฐ ์ค์ง
+ if (x1 == x2 && y1 == y2) continue; // * ๋์ ์ด ๊ฒน์น๊ฒ ๋๋ ๊ฒฝ์ฐ ์ค์ง
+
+ // * ์ํ์ข์ฐ์ ๋ํ์ฌ
+ for (int i = 0; i < 4; i++) {
+ // * ๋์ 1์ ๋ค์ ์์น
+ int nx1 = x1 + dx[i];
+ int ny1 = y1 + dy[i];
+
+ // * ๋์ 2์ ๋ค์ ์์น
+ int nx2 = x2 + dx[i];
+ int ny2 = y2 + dy[i];
+
+ if (!valueCheck(nx1, ny1) && !valueCheck(nx2, ny2)) { // ! ๋ชจ๋ ๋ฐ์ผ๋ก ๋จ์ด์ง๋ฉด ์ค์ง
+ continue;
+ } else if ((valueCheck(nx1, ny1) && !valueCheck(nx2 ,ny2)) || (!valueCheck(nx1, ny1) && valueCheck(nx2, ny2))) {
+ // ! ๋ ์ค ํ๋๋ง ๋จ์ด์ง๋ฉด ์ ๋ต์ count+1 ์ ์ฅ ํ ์ ์ฒด ์ข
๋ฃ
+ answer = count+1;
+ return;
+ } else {
+ // ! ๋ ๋์ ๋ชจ๋ ์๋จ์ด์ง๊ณ ์์ผ๋ฉด ํ์ ๋ฃ์ด ๊ณ์ ์งํ
+ if (arr[nx1][ny1] == '#') { // * ๋ฒฝ์ด ์๋ค๋ฉด nx -> x, ny -> y ์๋๋๋ก ๋ณต๊ท(์ด๋ํ์ง ๋ชปํจ)
+ nx1 = x1;
+ ny1 = y1;
+ }
+
+ if (arr[nx2][ny2] == '#') { // * ๋ฒฝ์ด ์๋ค๋ฉด nx -> x, ny -> y ์๋๋๋ก ๋ณต๊ท(์ด๋ํ์ง ๋ชปํจ)
+ nx2 = x2;
+ ny2 = y2;
+ }
+
+ // * ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ง ์์ ์์น์ ๋ํด์
+ if (!visited[nx1][ny1][nx2][ny2]) {
+ visited[nx1][ny1][nx2][ny2] = true; // * ๋ฐฉ๋ฌธ ํ์
+ queue.add(new int[] {nx1 ,ny1, nx2, ny2, count+1}); // * ํ์ ์ฝ์
+ }
+ }
+
+ }
+ }
+ }
+
+ // * ๋ณด๋์ ํฌ๊ธฐ ์์ ์ขํ๊ฐ ๋ค์ด๊ฐ์๋์ง ๊ฒ์ฌํ๋ ํจ์
+ public static boolean valueCheck(int x, int y) {
+ return 0 <= x && x < n && 0 <= y && y < m;
+ }
+
+ // * ์ด๊ธฐ ๋์ ์ ์์น๋ฅผ ์ฐพ๋ ํจ์
+ public static void findCoin() {
+ byte count = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (arr[i][j] == 'o') {
+ coin[count++] = new int[] {i, j};
+ arr[i][j] = '.';
+ }
+
+ if (count >= 3) break;
+ }
+ }
+ }
+
+ // * ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_16397.java b/java/BOJ/Gold/IV/G4_16397.java
new file mode 100644
index 0000000..be05c6d
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_16397.java
@@ -0,0 +1,104 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16397
+ *
+ * ? ์ ๋ชฉ: ํ์ถ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ํ์ต์ด๋ ํ์ต๋ํ๊ต ํ๋ก๊ทธ๋๋ฐ ๊ฒฝ์ง๋ํ์ ์ถ์ ์ง์ด๋ค. ํ์ต์ด๋ ์๋ฒฝ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๋ ๋์ค ๋คํต์์ ๋๊ปด์ง๋ ๊ณ ํต๊ณผ ํจ๊ป ์ ์ ์ ์์๋ค.
+ * ํ์ต์ด๋ ์ข์ ๋ฐฉ์์ ๋์ ๋ด๋ค. ์ฃผ๋ณ์ ์ดํด๋ณด๋ ๋ฒฝ๋ฉด์๋ LED๋ก ๋ ๋ค์ฏ ์๋ฆฌ ์ญ์ง์ N์ด, ๊ทธ ์์ T, G๋ผ๋ ์ํ๋ฒณ๊ณผ ํจ๊ป ๋ ๋ค๋ฅธ ์ ์ ๋ ๊ฐ๊ฐ ์ฐ์ฌ ์์๊ณ , ๋ฒฝ ์์๋ ๋ฒํผ A, B ๋ ๊ฐ๊ฐ ์์๋ค.
+ * ๋ฒํผ์ ์ด๋ฆฌ์ ๋ฆฌ ๋๋ฌ๋ณด๋ ๋๋ํ ํ์ต์ด๋ ์ด๋ป๊ฒ ํด์ผ ๋ฐฉ์ ํ์ถํ ์ ์์์ง ๊ธ๋ฐฉ ๋์น์ฑ๋ค.
+ * ๋ฒํผ๊ณผ ์์ ๋ํด ํ์ต์ด๊ฐ ์์๋ธ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
+ * ๋ฒํผ A๋ฅผ ๋๋ฅด๋ฉด N์ด 1 ์ฆ๊ฐํ๋ค.
+ * ๋ฒํผ B๋ฅผ ๋๋ฅด๋ฉด N์ 2๊ฐ ๊ณฑํด์ง ๋ค, 0์ด ์๋ ๊ฐ์ฅ ๋์ ์๋ฆฟ์์ ์ซ์๊ฐ 1 ์ค์ด๋ ๋ค. ์๋ฅผ ๋ค์ด 123โ146์ผ๋ก, 5โ0์ผ๋ก, 3โ5๋ก ๋ณํ๋ค. ๋จ, N์ด 0์ด๋ฉด ๋ฒํผ B๋ฅผ ๋๋ฌ๋ ์๊ฐ ๋ณํ์ง ์๋๋ค.
+ * LED๊ฐ ๋ค์ฏ ์๋ฆฌ๊น์ง๋ฐ์ ์๊ธฐ ๋๋ฌธ์ N์ด 99,999๋ฅผ ๋์ด๊ฐ๋ ์๊ฐ ํ์ถ์ ์คํจํ๊ฒ ๋๋ค.
+ * ๋ฒํผ B๋ฅผ ๋๋ฌ N์ 2๋ฅผ ๊ณฑํ ์๊ฐ ์๊ฐ 99,999๋ฅผ ๋์ด๊ฐ๋ค๋ฉด, ๋์ ์๋ฆฟ์์ ์๋ฅผ 1 ๋ฎ์ท์๋ 99,999๋ฅผ ๋์ง ์๋๋ค๊ณ ํด๋ ํ์ถ์ ์คํจํ๊ฒ ๋๋ค.
+ * ๋ํ ํ์ต์ด๋ ์ต๋ Tํ ๋ฒํผ์ ๋๋ฅผ ์ ์๊ณ , ๊ทธ ํ์ ์์ LED๋ก ํํ๋ N์ G์ ๊ฐ๊ฒ ๋ง๋ค์ด์ผ ํ์ถํ ์ ์๋ค๋ ์ฌ์ค์ ์์๋๋ค.
+ * ๋๋ํ ํ์ต์ด๋ ์ด์์ค์ ์์กด์ฌ์ด ๋ฐ๋ํด ๋ฒํผ ๋๋ฅด๋ ํ์๋ฅผ ์ต์๋ก ํ์ฌ ๋ฐฉ์ ํ์ถํ๊ธฐ๋ก ํ๋ค.
+ * ํ์ต์ด์ ๋ฐฉ ํ์ถ์ ๊ธฐ์ํ๋ฉฐ, ํ์ถ์ ํ์ํ ์ต์์ ๋ฒํผ ํ์๋ฅผ ๊ตฌํ์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ N (0 โค N โค 99,999), T (1 โค T โค 99,999), G (0 โค G โค 99,999)๊ฐ ๊ณต๋ฐฑ ํ๋๋ฅผ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
+ * ๊ฐ๊ฐ N์ LED๋ก ํํ๋ ์, T๋ ๋ฒํผ์ ๋๋ฅผ ์ ์๋ ์ต๋ ํ์, G๋ ํ์ถ์ ์ํด ๋๊ฐ์ด ๋ง๋ค์ด์ผ ํ๋ ์๋ฅผ ๋ปํ๋ค.
+ *
+ * 1 7 10 -> n t g
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ํ์ถ์ ํ์ํ ์ต์์ ๋ฒํผ ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ๋ง์ฝ ํ์ถํ ์ ์๋ค๋ฉด โANGโ์ ๋ฐ์ดํ ์์ด ์ถ๋ ฅํ๋ค.
+ *
+ * 7
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.156์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 19MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_16397 {
+ static final int MAX = 100_000;
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+ static int n, t, g;
+ static int[] visit;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int answer = bfs();
+ System.out.println(answer == -1 ? "ANG" : answer);
+ }
+
+ public static int bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(n);
+ visit[n] = 1;
+
+ while (!queue.isEmpty()) {
+ int cur = queue.poll();
+
+ if (visit[cur] > t+1) {
+ break;
+ }
+
+ if (cur == g) {
+ return visit[cur]-1;
+ }
+
+ // A
+ if (cur + 1 < MAX && visit[cur + 1] == 0) {
+ visit[cur + 1] = visit[cur] + 1;
+ queue.add(cur + 1);
+ }
+
+ // B
+ int next = 2 * cur;
+ if (cur != 0 && next < MAX) {
+ next = next - (int) Math.pow(10, Integer.toString(next).length()-1);
+ if (visit[next] == 0) {
+ visit[next] = visit[cur] + 1;
+ queue.add(next);
+ }
+ }
+ }
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ t = Integer.parseInt(st.nextToken());
+ g = Integer.parseInt(st.nextToken());
+
+ visit = new int[MAX];
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_16398.java b/java/BOJ/Gold/IV/G4_16398.java
new file mode 100644
index 0000000..b48621e
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_16398.java
@@ -0,0 +1,128 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16398
+ *
+ * ? ์ ๋ชฉ: ํ์ฑ ์ฐ๊ฒฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ํ์ต ์ ๊ตญ์ ์ค์ฌ์ ํ์ฑ T์ด๋ค. ์ ๊ตญ์ ํฉ์ ์ค์์ด๋ ํ์ฑ T์์ ์ ๊ตญ์ ํจ๊ณผ์ ์ผ๋ก ํต์นํ๊ธฐ ์ํด์, N๊ฐ์ ํ์ฑ ๊ฐ์ ํ๋ก์ฐ๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋ค.
+ * ๋ ํ์ฑ ๊ฐ์ ํ๋ก์ฐ๋ฅผ ์ค์นํ๋ฉด ์ ๊ตญ์ ํจ์ ๊ณผ ๋ฌด์ญ์ ๋ค์ ํ ํ์ฑ์์ ๋ค๋ฅธ ํ์ฑ์ผ๋ก ๋ฌด์ํ ์ ์์ ๋งํผ ์งง์ ์๊ฐ๋ง์ ์ด๋ํ ์ ์๋ค. ํ์ง๋ง, ์น์์ ์ ์งํ๊ธฐ ์ํด์ ํ๋ก์ฐ ๋ด์ ์ ๊ตญ๊ตฐ์ ์ฃผ๋์์ผ์ผ ํ๋ค.
+ * ๋ชจ๋ ํ์ฑ ๊ฐ์ ํ๋ก์ฐ๋ฅผ ์ค์นํ๊ณ ํ๋ก์ฐ ๋ด์ ์ ๊ตญ๊ตฐ์ ์ฃผ๋ํ๋ฉด, ์ ๊ตญ์ ์ ์ ์ด ์
ํ๋๊ธฐ ๋๋ฌธ์ ํฉ์ ์ค์์ด๋ ์ ๊ตญ์ ๋ชจ๋ ํ์ฑ์ ์ฐ๊ฒฐํ๋ฉด์ ํ๋ก์ฐ ๊ด๋ฆฌ ๋น์ฉ์ ์ต์ํ์ผ๋ก ํ๋ ค ํ๋ค.
+ * N๊ฐ์ ํ์ฑ์ ์ ์ 1,โฆ,N์ผ๋ก ํ์ํ๊ณ , ํ์ฑ i์ ํ์ฑ j์ฌ์ด์ ํ๋ก์ฐ ๊ด๋ฆฌ๋น์ฉ์ Cij์ด๋ฉฐ, i = j์ธ ๊ฒฝ์ฐ ํญ์ 0์ด๋ค.
+ * ์ ๊ตญ์ ์ฐธ๋ชจ์ธ ๋น์ ์ ์ ๊ตญ์ ํฉ์ ์ค์์ด๋ฅผ ๋์ ์ ๊ตญ ๋ด ๋ชจ๋ ํ์ฑ์ ์ฐ๊ฒฐํ๊ณ , ๊ทธ ์ ์ง๋น์ฉ์ ์ต์ํํ์. ์ด๋ ํ๋ก์ฐ์ ์ค์น๋น์ฉ์ ๋ฌด์ํ๊ธฐ๋ก ํ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ผ๋ก ์ฒซ ์ค์ ํ์ฑ์ ์ N (1 โค N โค 1000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋ ๋ฒ์งธ ์ค๋ถํฐ N+1์ค๊น์ง ๊ฐ ํ์ฑ๊ฐ์ ํ๋ก์ฐ ๊ด๋ฆฌ ๋น์ฉ์ด N x N ํ๋ ฌ (Cij), (1 โค i, j โค N, 1 โค Cij โค 100,000,000, Cij = Cji, Cii = 0) ๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 3 -> n
+ * 0 2 3 -> arr[0][0] ~ arr[0][n-1]
+ * 2 0 1
+ * 3 1 0 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ชจ๋ ํ์ฑ์ ์ฐ๊ฒฐํ์ ๋, ์ต์ ํ๋ก์ฐ์ ๊ด๋ฆฌ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 1.556์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 185MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G4_16398 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static long cost;
+ static boolean[] visited;
+ static int[] parent;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ prim(); // * 2. ์ต์ ์คํจ๋ ํธ๋ฆฌ(ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ)
+ bw.write(String.valueOf(cost)); // * 3. ์ถ๋ ฅ
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์ต์ ์คํจ๋ ํธ๋ฆฌ(ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ)
+ public static void prim() {
+ int count = 1;
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> a[2] - b[2]);
+ for (int i = 1; i < n; i++) {
+ pq.add(new int[] {0, i, arr[0][i]});
+ }
+
+ while (!pq.isEmpty() || count < n) {
+ int[] cur = pq.poll();
+
+ if (findParent(cur[0]) != findParent(cur[1])) {
+ count++;
+ cost += cur[2];
+ union(cur[0], cur[1]);
+
+ for (int i = 0; i < n; i++) {
+ if (i == cur[1]) {
+ continue;
+ }
+
+ pq.add(new int[] {cur[1], i, arr[cur[1]][i]});
+ }
+ }
+ }
+
+ }
+
+ // UNION_FIND
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ public static void union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ parent = IntStream.range(0, n).toArray();
+ arr = new int[n][n];
+ visited = new boolean[n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j= 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_16929.java b/java/BOJ/Gold/IV/G4_16929.java
new file mode 100644
index 0000000..72b09fd
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_16929.java
@@ -0,0 +1,126 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16929
+ *
+ * ? ์ ๋ชฉ: Two Dots
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * Two Dots๋ Playdots, Inc.์์ ๋ง๋ ๊ฒ์์ด๋ค. ๊ฒ์์ ๊ธฐ์ด ๋จ๊ณ๋ ํฌ๊ธฐ๊ฐ NรM์ธ ๊ฒ์ํ ์์์ ์งํ๋๋ค.
+ * ๊ฐ๊ฐ์ ์นธ์ ์์ด ์น ํด์ง ๊ณต์ด ํ๋์ฉ ์๋ค. ์ด ๊ฒ์์ ํต์ฌ์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ์ฌ์ดํด์ ์ฐพ๋ ๊ฒ์ด๋ค.
+ * ๋ค์์ ์์ ๊ฒ์ํ์์ ๋ง๋ค ์ ์๋ ์ฌ์ดํด์ ์์์ด๋ค.
+ * ์ k๊ฐ d1, d2, ..., dk๋ก ์ด๋ฃจ์ด์ง ์ฌ์ดํด์ ์ ์๋ ์๋์ ๊ฐ๋ค.
+ *
+ * ๋ชจ๋ k๊ฐ์ ์ ์ ์๋ก ๋ค๋ฅด๋ค.
+ * k๋ 4๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค.
+ * ๋ชจ๋ ์ ์ ์์ ๊ฐ๋ค.
+ * ๋ชจ๋ 1 โค i โค k-1์ ๋ํด์, di์ di+1์ ์ธ์ ํ๋ค. ๋, dk์ d1๋ ์ธ์ ํด์ผ ํ๋ค. ๋ ์ ์ด ์ธ์ ํ๋ค๋ ๊ฒ์ ๊ฐ๊ฐ์ ์ ์ด ๋ค์ด์๋ ์นธ์ด ๋ณ์ ๊ณต์ ํ๋ค๋ ์๋ฏธ์ด๋ค.
+ * ๊ฒ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฌ์ดํด์ด ์กด์ฌํ๋์ง ์๋์ง ๊ตฌํด๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๊ฒ์ํ์ ํฌ๊ธฐ N, M์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฒ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฒ์ํ์ ๋ชจ๋ ์ ์ผ๋ก ๊ฐ๋์ฐจ ์๊ณ , ๊ฒ์ํ์ ์ํ๋ ์ ์ ์์ ์๋ฏธํ๋ค. ์ ์ ์์ ์ํ๋ฒณ ๋๋ฌธ์ ํ ๊ธ์์ด๋ค.
+ *
+ * 3 4 -> n m
+ * AAAA -> arr[0][0] ~ arr[0][m-1]
+ * ABCA
+ * AAAA -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ "Yes", ์๋ ๊ฒฝ์ฐ์๋ "No"๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * Yes
+ *
+ * ? ์ ํ
+ *
+ * 2 โค N, M โค 50
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G4_16929 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean hasCycle = false;
+ static boolean[][] visit;
+
+ // * ์ํ์ข์ฐ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DFS
+ dfsLoop:
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (!visit[i][j]) {
+ visit[i][j] = true;
+ dfs(i, j, i, j);
+ }
+
+ if (hasCycle) {
+ break dfsLoop;
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(hasCycle ? "Yes" : "No");
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // DFS
+ public static void dfs(int x, int y, int bx, int by) {
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m || (nx == bx && ny == by)) {
+ continue;
+ }
+
+ if (arr[nx][ny] == arr[x][y]) {
+ if (visit[nx][ny]) {
+ hasCycle = true;
+ return;
+ }
+
+ visit[nx][ny] = true;
+ dfs(nx, ny, x, y);
+ }
+ }
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ visit = new boolean[n][m];
+ arr = new char[n][m];
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_16973.java b/java/BOJ/Gold/IV/G4_16973.java
new file mode 100644
index 0000000..c588c1d
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_16973.java
@@ -0,0 +1,137 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/16973
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ? ์๊ฐ: 1.292์ด / 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ: 126MB / 512MB
+ * ? ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_16973 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m, h, w, sx, sy, fx, fy;
+
+ // ํ, ์, ์ฐ, ์ข
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ static int[][] visit;
+ static int[][] arr;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ System.out.println(bfs());
+ }
+
+ public static int bfs() {
+ visit[sx][sy] = 1;
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {sx, sy});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == fx && cur[1] == fy) {
+ return visit[fx][fy]-1;
+ }
+
+ // ์๋๋ก ๋ด๋ ค๊ฐ ๋: ๋งจ ์๋ซ์ค์ ์ ํ ์์ด์ผ ํจ
+ if (cur[0]+h <= n && visit[cur[0]+1][cur[1]] == 0) {
+ down:
+ for (int i = 0; i < w; i++) {
+ if (arr[cur[0] + h][cur[1] + i] == 1) {
+ break down;
+ }
+
+ if (i == w-1) {
+ visit[cur[0]+1][cur[1]] = visit[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {cur[0]+1, cur[1]});
+ }
+ }
+ }
+
+ // ์๋ก ์ฌ๋ผ๊ฐ ๋: ๋งจ ์์ค์ด ์ ํ์ด ์์ด์ผ ํจ
+ if (cur[0] > 1 && visit[cur[0]-1][cur[1]] == 0) {
+ up:
+ for (int i = 0; i < w; i++) {
+ if (arr[cur[0] - 1][cur[1] + i] == 1) {
+ break up;
+ }
+
+ if (i == w-1) {
+ visit[cur[0]-1][cur[1]] = visit[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {cur[0]-1, cur[1]});
+ }
+ }
+ }
+
+ // ์ผ์ชฝ: ๋งจ ์ผ์ชฝ์ด ์ ํ์ด ์์ด์ผ ํจ
+ if (cur[1] > 1 && visit[cur[0]][cur[1]-1] == 0) {
+ left:
+ for (int i = 0; i < h; i++) {
+ if (arr[cur[0]+i][cur[1]-1] == 1) {
+ break left;
+ }
+
+ if (i == h-1) {
+ visit[cur[0]][cur[1]-1] = visit[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {cur[0], cur[1]-1});
+ }
+ }
+ }
+
+ // ์ค๋ฅธ์ชฝ: ๋งจ ์ค๋ฅธ์ชฝ์ด ์ ํ์ด ์์ด์ผ ํจ
+ if (cur[1]+w <= m && visit[cur[0]][cur[1]+1] == 0) {
+ right:
+ for (int i = 0; i < h; i++) {
+ if (arr[cur[0]+i][cur[1]+w] == 1) {
+ break right;
+ }
+
+ if (i == h-1) {
+ visit[cur[0]][cur[1]+1] = visit[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {cur[0], cur[1]+1});
+ }
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n+1][m+1];
+ visit = new int[n+1][m+1];
+
+ for (int i = 1; i <= n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 1; j <= m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+
+ st = new StringTokenizer(br.readLine());
+
+ h = Integer.parseInt(st.nextToken());
+ w = Integer.parseInt(st.nextToken());
+ sx = Integer.parseInt(st.nextToken());
+ sy = Integer.parseInt(st.nextToken());
+ fx = Integer.parseInt(st.nextToken());
+ fy = Integer.parseInt(st.nextToken());
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_17141.java b/java/BOJ/Gold/IV/G4_17141.java
new file mode 100644
index 0000000..c0fc095
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_17141.java
@@ -0,0 +1,195 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/17141
+ *
+ * ! ์ ๋ชฉ: ์ฐ๊ตฌ์2
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ์ธ์ฒด์ ์น๋ช
์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์ ์น์์ด๊ฐ ์นจ์
ํ๊ณ , ๋ฐ์ด๋ฌ์ค๋ฅผ ์ ์ถํ๋ ค๊ณ ํ๋ค. ์น์์ด๋ ์ฐ๊ตฌ์์ ํน์ ์์น์ ๋ฐ์ด๋ฌ์ค M๊ฐ๋ฅผ ๋์ ๊ฒ์ด๊ณ , ์น์์ด์ ์ ํธ์ ๋์์ ๋ฐ์ด๋ฌ์ค๋ ํผ์ง๊ฒ ๋๋ค.
+ * ์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ NรN์ธ ์ ์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ ์ฌ๊ฐํ์ 1ร1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ์ฐ๊ตฌ์๋ ๋น ์นธ, ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๋ฒฝ์ ์นธ ํ๋๋ฅผ ๊ฐ๋ ์ฐจ์งํ๋ค.
+ * ์ผ๋ถ ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์ ์๋ ์นธ์ด๋ค. ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋ชจ๋ ๋น ์นธ์ผ๋ก ๋์์ ๋ณต์ ๋๋ฉฐ, 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ฐ๊ตฌ์๊ฐ ์๊ธด ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์. 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์ ์๋ ์นธ์ด๋ค.
+ *
+ * 2 0 0 0 1 1 0
+ * 0 0 1 0 1 2 0
+ * 0 1 1 0 1 0 0
+ * 0 1 0 0 0 0 0
+ * 0 0 0 2 0 1 1
+ * 0 1 0 0 0 0 0
+ * 2 1 0 0 0 0 2
+ *
+ * M = 3์ด๊ณ , ๋ฐ์ด๋ฌ์ค๋ฅผ ์๋์ ๊ฐ์ด ๋์ ๊ฒฝ์ฐ 6์ด๋ฉด ๋ชจ๋ ์นธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋ค. ๋ฒฝ์ -, ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์์น๋ 0, ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ ์๊ฐ์ผ๋ก ํ์ํ๋ค.
+ *
+ * 6 6 5 4 - - 2
+ * 5 6 - 3 - 0 1
+ * 4 - - 2 - 1 2
+ * 3 - 2 1 2 2 3
+ * 2 2 1 0 1 - -
+ * 1 - 2 1 2 3 4
+ * 0 - 3 2 3 4 5
+ *
+ * ์๊ฐ์ด ์ต์๊ฐ ๋๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๊ณ , 5์ด๋ง์ ๋ชจ๋ ์นธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋ค.
+ *
+ * 0 1 2 3 - - 2
+ * 1 2 - 3 - 0 1
+ * 2 - - 2 - 1 2
+ * 3 - 2 1 2 2 3
+ * 3 2 1 0 1 - -
+ * 4 - 2 1 2 3 4
+ * 5
+ * - 3 2 3 4 5
+ * ์ฐ๊ตฌ์์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฌ๋ ์ต์ ์๊ฐ์ ๊ตฌํด๋ณด์.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ฐ๊ตฌ์์ ํฌ๊ธฐ N(5 โค N โค 50), ๋์ ์ ์๋ ๋ฐ์ด๋ฌ์ค์ ๊ฐ์ M(1 โค M โค 10)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ฐ๊ตฌ์์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์ ์๋ ์นธ์ด๋ค. 2์ ๊ฐ์๋ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 7 3 -> n m
+ * 2 0 0 0 1 1 0 -> arr[0][0] ~ arr[0][n-1]
+ * 0 0 1 0 1 2 0
+ * 0 1 1 0 1 0 0
+ * 0 1 0 0 0 0 0
+ * 0 0 0 2 0 1 1
+ * 0 1 0 0 0 0 0
+ * 2 1 0 0 0 0 2 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฐ๊ตฌ์์ ๋ชจ๋ ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์๊ฒ ๋๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ฐ์ด๋ฌ์ค๋ฅผ ์ด๋ป๊ฒ ๋์๋ ๋ชจ๋ ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 252ms
+ * ๋ฉ๋ชจ๋ฆฌ: 42312KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.*;
+
+public class G4_17141 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, m;
+ static int[][] arr;
+
+ // ์ด๊ธฐ ์ค์
+ static int min = 10000;
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+ static ArrayList list = new ArrayList<>();
+
+ // * ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ ์ค์์ m๊ฐ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ๊ฒฝ์ฐ์๋ง BFS ์คํ
+ for (int i = 0; i < (1 << list.size()); i++) {
+ List virusList = findVirus(i); // * ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์ ์๋ ๊ฒฝ์ฐ
+
+ if (virusList.size() == m) { // * m๊ฐ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ๊ฒฝ์ฐ
+ bfs(virusList); // * ํด๋น ๋ฐ์ด๋ฌ์ค ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ BFS ์ํ
+ }
+ }
+
+ // * ์ถ๋ ฅ
+ bw.write(String.valueOf(min == 10000 ? -1: min));
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! BFS
+ public static void bfs(List virusList) {
+ LinkedList queue = new LinkedList<>();
+ int[][] visited = new int[n][n];
+ int maxTime = 0;
+
+ // * ๋ฐฉ๋ฌธ๋ฆฌ์คํธ -1๋ก ์ด๊ธฐํ
+ for (int[] v: visited) {
+ Arrays.fill(v, -1);
+ }
+
+ // * m๊ฐ์ ๋ฐ์ด๋ฌ์ค ์์น์ ๋ํ์ฌ ๋ฐฉ๋ฌธํ์ ํ ํ์ ์ฝ์
+ for (int[] virus: virusList) {
+ queue.add(virus);
+ visited[virus[0]][virus[1]] = 0;
+ }
+
+ // * BFS ์ํ
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (0 <= nx && nx < n && 0 <= ny && ny < n && visited[nx][ny] == -1 && arr[nx][ny] != 1) {
+ visited[nx][ny] = visited[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {nx, ny});
+
+ if (maxTime < visited[nx][ny]) {
+ maxTime = visited[nx][ny];
+ }
+ }
+ }
+ }
+
+ boolean virused = check(visited); // * ๋ฒฝ์ ์ ์ธํ ๋ชจ๋ ๊ณณ์ด ๋ฐ์ด๋ฌ์ค์ ๊ฐ์ผ๋์๋์ง ํ์ธ
+
+ // * ๋ฒฝ์ ์ ์ธํ ๋ชจ๋ ๊ณณ์ด ๋ฐ์ด๋ฌ์ค์ ๊ฐ์ผ๋์์ ๋, ๊ธฐ์กด์ ๋ชจ๋ ๊ฐ์ผ๋ ์ต์ ์๊ฐ๊ณผ ๋น๊ตํ์ฌ ์ต์๊ฐ ์
๋ฐ์ดํธ
+ if (virused && maxTime < min) {
+ min = maxTime;
+ }
+ }
+
+ // ! ๋ฒฝ์ ์ ์ธํ ๋ชจ๋ ๊ณณ์ด ๋ฐ์ด๋ฌ์ค์ ๊ฐ์ผ๋์๋์ง ํ์ธํ๋ ํจ์
+ public static boolean check(int[][] visited) {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (arr[i][j] != 1 && visited[i][j] == -1) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ // ! ๋ฐ์ด๋ฌ์ค๋ฅผ ๋์ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฆฌ์คํธ์ ๋ด์ ๋ฆฌํด
+ public static List findVirus(int i) {
+ String s = Integer.toBinaryString(i);
+ List virusList = new ArrayList<>();
+
+ for (int k = 0; k < s.length(); k++) {
+ if (s.charAt(s.length() - k - 1) == '1') {
+ virusList.add(list.get(k));
+ }
+ }
+
+ return virusList;
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ arr = new int[n][n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ if (arr[i][j] == 2) list.add(new int[] {i, j});
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_18223.java b/java/BOJ/Gold/IV/G4_18223.java
new file mode 100644
index 0000000..de39e4c
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_18223.java
@@ -0,0 +1,87 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/18223
+ *
+ * ? ์๊ฐ: 396ms
+ * ? ๋ฉ๋ชจ๋ฆฌ: 23784KB
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.*;
+
+public class G4_18223 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, m, p;
+ static ArrayList[] adj;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int sDistance = bfs(1, n);
+ int fDistance = bfs(1, p) + bfs(p, n);
+
+ if (sDistance == fDistance) {
+ bw.write("SAVE HIM");
+ } else {
+ bw.write("GOOD BYE");
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static int bfs(int start, int end) {
+ Queue queue = new PriorityQueue<>((a, b) -> a[1] - b[1]);
+ queue.add(new int[] {start, 1});
+ int[] visit = new int[n+1];
+ visit[start] = 1;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == end) {
+ return cur[1] - 1;
+ }
+
+ if (cur[1] > visit[cur[0]]) {
+ continue;
+ }
+
+ for (int[] next: adj[cur[0]]) {
+ if (visit[next[0]] == 0 || visit[next[0]] > cur[1] + next[1]) {
+ visit[next[0]] = cur[1] + next[1];
+ queue.add(new int[] {next[0], visit[next[0]]});
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ p = Integer.parseInt(st.nextToken());
+
+ adj = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ adj[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ adj[a].add(new int[] {b, c});
+ adj[b].add(new int[] {a, c});
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_1915.java b/java/BOJ/Gold/IV/G4_1915.java
new file mode 100644
index 0000000..f06a0da
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_1915.java
@@ -0,0 +1,99 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1915
+ *
+ * ? ์ ๋ชฉ: ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * nรm์ 0, 1๋ก ๋ ๋ฐฐ์ด์ด ์๋ค. ์ด ๋ฐฐ์ด์์ 1๋ก ๋ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * 0 1 0 0
+ * 0 1 1 1
+ * 1 1 1 0
+ * 0 0 1 0
+ * ์์ ๊ฐ์ ์์ ์์๋ ๊ฐ์ด๋ฐ์ 2ร2 ๋ฐฐ์ด์ด ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ n, m(1 โค n, m โค 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ n๊ฐ์ ์ค์๋ m๊ฐ์ ์ซ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 4 4 -> n m
+ * 0100 -> arr[0][0] ~ arr[0][m-1]
+ * 0111
+ * 1110
+ * 0010 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.236์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 25MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G4_1915 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static char[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = 0;
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP Table ์ด๊ธฐํ
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ dp[i][j] = arr[i][j] - '0';
+ }
+ }
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (i == 0 || j == 0) {
+ max = Math.max(max, arr[i][j] - '0');
+ continue;
+ }
+
+ if (arr[i][j] == '0') {
+ continue;
+ }
+ dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
+ max = Math.max(dp[i][j], max);
+ }
+ }
+
+ // * 4. ์ถ๋ ฅ
+ System.out.println(max * max);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new char[n][m];
+ dp = new int[n][m];
+
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_20040.java b/java/BOJ/Gold/IV/G4_20040.java
new file mode 100644
index 0000000..df26006
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_20040.java
@@ -0,0 +1,101 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/20040
+ *
+ * ! ์ ๋ชฉ: ์ฌ์ดํด ๊ฒ์
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ์ฌ์ดํด ๊ฒ์์ ๋ ๋ช
์ ํ๋ ์ด์ด๊ฐ ์ฐจ๋ก๋๋ก ๋์๊ฐ๋ฉฐ ์งํํ๋ ๊ฒ์์ผ๋ก, ์ ํ๋ ์ด์ด๊ฐ ํ์ ๋ฒ์งธ ์ฐจ๋ก๋ฅผ, ํ ํ๋ ์ด์ด๊ฐ ์ง์ ๋ฒ์งธ ์ฐจ๋ก๋ฅผ ์งํํ๋ค. ๊ฒ์ ์์ ์ 0 ๋ถํฐ n โ 1 ๊น์ง ๊ณ ์ ํ ๋ฒํธ๊ฐ ๋ถ์ฌ๋ ํ๋ฉด ์์ ์ n ๊ฐ๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์ด ์ค ์ด๋ ์ธ ์ ๋ ์ผ์ง์ ์์ ๋์ด์ง ์๋๋ค. ๋งค ์ฐจ๋ก ๋ง๋ค ํ๋ ์ด์ด๋ ๋ ์ ์ ์ ํํด์ ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ ๋ถ์ ๊ธ๋๋ฐ, ์ด์ ์ ๊ทธ๋ฆฐ ์ ๋ถ์ ๋ค์ ๊ทธ์ ์๋ ์์ง๋ง ์ด๋ฏธ ๊ทธ๋ฆฐ ๋ค๋ฅธ ์ ๋ถ๊ณผ ๊ต์ฐจํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค. ๊ฒ์์ ์งํํ๋ค๊ฐ ์ฒ์์ผ๋ก ์ฌ์ดํด์ ์์ฑํ๋ ์๊ฐ ๊ฒ์์ด ์ข
๋ฃ๋๋ค. ์ฌ์ดํด C๋ ํ๋ ์ด์ด๊ฐ ๊ทธ๋ฆฐ ์ ๋ถ๋ค์ ๋ถ๋ถ์งํฉ์ผ๋ก, ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค.
+ * C์ ์ํ ์์์ ์ ๋ถ์ ํ ๋์ ์์ ์ถ๋ฐํ์ฌ ๋ชจ๋ ์ ๋ถ์ ํ ๋ฒ์ฉ๋ง ์ง๋์ ์ถ๋ฐ์ ์ผ๋ก ๋๋์์ฌ ์ ์๋ค.
+ * ๋ฌธ์ ๋ ์ ๋ถ์ ์ฌ๋ฌ ๊ฐ ๊ทธ๋ฆฌ๋ค ๋ณด๋ฉด ์ฌ์ดํด์ด ์์ฑ ๋์๋์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ์ด๋ ค์ ์ด๋ฏธ ์ฌ์ดํด์ด ์์ฑ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๊ฒ์์ ๊ณ์ ์งํํ๊ฒ ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฒ์์ ์งํ ์ํฉ์ด ์ฃผ์ด์ง๋ฉด ๋ช ๋ฒ์งธ ์ฐจ๋ก์์ ์ฌ์ดํด์ด ์์ฑ๋์๋์ง, ํน์ ์์ง ๊ฒ์์ด ์งํ ์ค์ธ์ง๋ฅผ ํ๋จํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ค ํ๋ค.
+ * ์
๋ ฅ์ผ๋ก ์ ์ ๊ฐ์ n๊ณผ m ๋ฒ์งธ ์ฐจ๋ก๊น์ง์ ๊ฒ์ ์งํ ์ํฉ์ด ์ฃผ์ด์ง๋ฉด ์ฌ์ดํด์ด ์์ฑ ๋์๋์ง๋ฅผ ํ๋จํ๊ณ , ์์ฑ๋์๋ค๋ฉด ๋ช ๋ฒ์งธ ์ฐจ๋ก์์ ์ฒ์์ผ๋ก ์ฌ์ดํด์ด ์์ฑ๋ ๊ฒ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ํ์ค์
๋ ฅ์ ์ฌ์ฉํ๋ค. ์
๋ ฅ์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ 3 โค n โค 500,000 ๊ณผ ์งํ๋ ์ฐจ๋ก์ ์๋ฅผ ๋ํ๋ด๋ ์ ์ 3 โค m โค 1,000,000 ์ด ์ฃผ์ด์ง๋ค. ๊ฒ์์์ ์ฌ์ฉํ๋ n๊ฐ์ ์ ์๋ 0 ๋ถํฐ n โ 1 ๊น์ง ๊ณ ์ ํ ๋ฒํธ๊ฐ ๋ถ์ฌ๋์ด ์์ผ๋ฉฐ, ์ด ์ค ์ด๋ ์ธ ์ ๋ ์ผ์ง์ ์์ ๋์ด์ง ์๋๋ค. ์ด์ด์ง๋ m ๊ฐ์ ์
๋ ฅ ์ค์๋ ๊ฐ๊ฐ i๋ฒ์งธ ์ฐจ๋ก์ ํด๋น ํ๋ ์ด์ด๊ฐ ์ ํํ ๋ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค (1 โค i โค m).
+ *
+ * 6 5 -> n m
+ * 0 1 -> a b
+ * 1 2 -> a b
+ * 1 3 -> a b
+ * 0 3 -> a b
+ * 4 5 -> a b
+ *
+ * ! ์ถ๋ ฅ
+ * ์ถ๋ ฅ์ ํ์ค์ถ๋ ฅ์ ์ฌ์ฉํ๋ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ผ์ด์ค์ ๋ํด, m ๋ฒ์งธ ์ฐจ๋ก๊น์ง ๊ฒ์์ ์งํํ ์ํฉ์์ ์ด๋ฏธ ๊ฒ์์ด ์ข
๋ฃ๋์๋ค๋ฉด ์ฌ์ดํด์ด ์ฒ์์ผ๋ก ๋ง๋ค์ด์ง ์ฐจ๋ก์ ๋ฒํธ๋ฅผ ์์ ์ ์๋ก ์ถ๋ ฅํ๊ณ , m ๋ฒ์ ์ฐจ๋ก๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ดํ์๋ ์ข
๋ฃ๋์ง ์์๋ค๋ฉด 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 648ms
+ * ๋ฉ๋ชจ๋ฆฌ: 136524KB
+ * ์ธ์ด: JAVA8
+*/
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G4_20040 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ์ด๊ธฐ์ค์
+ static int n, m, parent[];
+
+ // * ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ int result = solution(); // ! ์
๋ ฅ๊ฐ ๋ฐ์ผ๋ฉด์ ๋ฐ๋ก KRUSKAL ์๊ณ ๋ฆฌ์ฆ ์ํ
+ bw.write(String.valueOf(result)); // ์ถ๋ ฅ
+
+ // * ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // * UNION_FIND
+ public static boolean union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a == b) {
+ return false;
+ } else if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ return true;
+ }
+
+ // * UNION_FIND(ํฉ์งํฉ์์์ฐพ๊ธฐ)
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ // * ์
๋ ฅ๊ฐ๋ฐ๋ ๋์์ ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ ์ํ
+ public static int solution() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ parent = IntStream.range(0, n).toArray();
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ if (!union(a, b)) {
+ return i+1;
+ }
+ }
+ return 0;
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_20058.java b/java/BOJ/Gold/IV/G4_20058.java
new file mode 100644
index 0000000..62ddc21
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_20058.java
@@ -0,0 +1,214 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/20058
+ *
+ * ? ์ ๋ชฉ: ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ๋ง๋ฒ์ฌ ์์ด๋ ํ์ด์ด๋ณผ๊ณผ ํ ๋ค์ด๋๋ฅผ ์กฐํฉํด ํ์ด์ด์คํฐ์ ์์ ํ ์ ์๋ค. ์ค๋์ ํ์ด์ด์คํฐ์ ํฌ๊ธฐ๊ฐ 2N ร 2N์ธ ๊ฒฉ์๋ก ๋๋์ด์ง ์ผ์ํ์์ ์ฐ์ตํ๋ ค๊ณ ํ๋ค. ์์น (r, c)๋ ๊ฒฉ์์ rํ c์ด์ ์๋ฏธํ๊ณ , A[r][c]๋ (r, c)์ ์๋ ์ผ์์ ์์ ์๋ฏธํ๋ค. A[r][c]๊ฐ 0์ธ ๊ฒฝ์ฐ ์ผ์์ด ์๋ ๊ฒ์ด๋ค.
+ * ํ์ด์ด์คํฐ์ ์์ ํ๋ ค๋ฉด ์์ ํ ๋๋ง๋ค ๋จ๊ณ L์ ๊ฒฐ์ ํด์ผ ํ๋ค. ํ์ด์ด์คํฐ์ ๋จผ์ ๊ฒฉ์๋ฅผ 2L ร 2L ํฌ๊ธฐ์ ๋ถ๋ถ ๊ฒฉ์๋ก ๋๋๋ค. ๊ทธ ํ, ๋ชจ๋ ๋ถ๋ถ ๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํจ๋ค. ์ดํ ์ผ์์ด ์๋ ์นธ 3๊ฐ ๋๋ ๊ทธ ์ด์๊ณผ ์ธ์ ํด์์ง ์์ ์นธ์ ์ผ์์ ์์ด 1 ์ค์ด๋ ๋ค. (r, c)์ ์ธ์ ํ ์นธ์ (r-1, c), (r+1, c), (r, c-1), (r, c+1)์ด๋ค. ์๋ ๊ทธ๋ฆผ์ ์นธ์ ์ ํ ์ ์๋ ์นธ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ ์ ์ ์์ด๋ค.
+ * ๋ง๋ฒ์ ์์ ํ๊ธฐ ์ L = 1 L = 2
+ * ๋ง๋ฒ์ฌ ์์ด๋ ํ์ด์ด์คํฐ์ ์ด Q๋ฒ ์์ ํ๋ ค๊ณ ํ๋ค. ๋ชจ๋ ํ์ด์ด์คํฐ์ ์์ ํ ํ, ๋ค์ 2๊ฐ์ง๋ฅผ ๊ตฌํด๋ณด์.
+ * ๋จ์์๋ ์ผ์ A[r][c]์ ํฉ
+ * ๋จ์์๋ ์ผ์ ์ค ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์
+ * ์ผ์์ด ์๋ ์นธ์ด ์ผ์์ด ์๋ ์นธ๊ณผ ์ธ์ ํด ์์ผ๋ฉด, ๋ ์นธ์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ๋ค. ๋ฉ์ด๋ฆฌ๋ ์ฐ๊ฒฐ๋ ์นธ์ ์งํฉ์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N๊ณผ Q๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ 2N๊ฐ์ ์ค์๋ ๊ฒฉ์์ ๊ฐ ์นธ์ ์๋ ์ผ์์ ์์ด ์ฃผ์ด์ง๋ค. r๋ฒ์งธ ์ค์์ c๋ฒ์งธ ์ฃผ์ด์ง๋ ์ ์๋ A[r][c] ์ด๋ค.
+ * ๋ง์ง๋ง ์ค์๋ ๋ง๋ฒ์ฌ ์์ด๊ฐ ์์ ํ ๋จ๊ณ L1, L2, ..., LQ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 3 1 -> n q
+ * 1 2 3 4 5 6 7 8 -> arr[0][0] ~ arr[0][2^n - 1]
+ * 8 7 6 5 4 3 2 1
+ * 1 2 3 4 5 6 7 8
+ * 8 7 6 5 4 3 2 1
+ * 1 2 3 4 5 6 7 8
+ * 8 7 6 5 4 3 2 1
+ * 1 2 3 4 5 6 7 8
+ * 8 7 6 5 4 3 2 1 -> arr[2^n - 1][0] ~ arr[2^n - 1][2^n - 1]
+ * 1 -> fire[0] ~ fire[q-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋จ์์๋ ์ผ์ A[r][c]์ ํฉ์ ์ถ๋ ฅํ๊ณ , ๋์งธ ์ค์ ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋จ, ๋ฉ์ด๋ฆฌ๊ฐ ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.\
+ *
+ * 284
+ * 64
+ *
+ * ? ์ ํ
+ * 2 โค N โค 6
+ * 1 โค Q โค 1,000
+ * 0 โค A[r][c] โค 100
+ * 0 โค Li โค N
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.316์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 54MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.StringTokenizer;
+
+public class G4_20058 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, q, len;
+ static int[][] arr;
+ static int[] fire;
+
+ // * 4๋ฐฉ
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[][] visited;
+ static ArrayList mass = new ArrayList<>();
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ for (int l : fire) { // * 2. ํ์ด์ด์คํฐ ์๋๋ง๋ค 90๋ ํ์ ํ ์ผ์ ๋
น์ด๊ธฐ
+ arr = clockwiseRotate((int) Math.pow(2, l)); // * ๊ธฐ์ค๊ฒฉ์๋ง๋ค ํ์
+ melt(); // * ์ผ์ ๋
น์ด๊ธฐ
+ }
+
+ int sum = findSum(); // * 3. ๋จ์์๋ ์ผ์ ๊ฐ์์ ํฉ
+ int max = findMax(); // * 4. ๋จ์์๋ ์ผ์ ๋ฉ์ด๋ฆฌ์ ๊ฐ์์ ์ต๋๊ฐ
+
+ // * 5. ์ถ๋ ฅ
+ bw.write(sum + "\n");
+ bw.write(max + "\n");
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ q = Integer.parseInt(st.nextToken());
+ len = (int) Math.pow(2, n);
+
+ arr = new int[len][len];
+ fire = new int[q];
+
+ for (int i = 0; i < len; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < len; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < q; i++) {
+ fire[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+
+ // ๊ธฐ์ค๊ฒฉ์๊ธธ์ด(l)๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ณ๋ฐฉํฅ 90๋ ํ์
+ public static int[][] clockwiseRotate(int l) {
+ int[][] newArr = new int[len][len];
+
+ for (int x = 0; x < len; x += l) {
+ for (int y = 0; y < len; y += l) {
+ for (int i = x; i < x + l; i++) {
+ for (int j = y; j < y + l; j++) {
+ newArr[j-y+x][l-1-i+x+y] = arr[i][j];
+ }
+ }
+ }
+ }
+
+ return newArr;
+ }
+
+ // ์ธ์ ํ 4๋ฐฉ์ ์ผ์์ด ์๋ ๊ฒฝ์ฐ๊ฐ 3๊ฐ ๋ฏธ๋ง์ผ ๋ ์ผ์๋
น์ด๊ธฐ
+ public static void melt() {
+ ArrayList list = new ArrayList<>();
+
+ for (int i = 0; i < len; i++) {
+ for (int j = 0; j < len; j++) {
+ int count = 0;
+ for (int k = 0; k < 4; k++) {
+ int ni = i + dx[k];
+ int nj = j + dy[k];
+
+ if (ni < 0 || nj < 0 || ni >= len || nj >= len) {
+ continue;
+ }
+
+ if (arr[ni][nj] > 0) {
+ count++;
+ }
+ }
+
+ if (count < 3) {
+ list.add(new int[] {i, j});
+ }
+ }
+ }
+
+ for (int[] m : list) {
+ if (arr[m[0]][m[1]] > 0) {
+ arr[m[0]][m[1]]--;
+ }
+ }
+ }
+
+ // ๋จ์์๋ ์ผ์ ๊ฐ์ ํฉ ๊ตฌํ๊ธฐ
+ public static int findSum() {
+ int sum = 0;
+ for (int i = 0; i < len; i++) {
+ for (int j = 0; j < len; j++) {
+ sum += arr[i][j];
+ }
+ }
+ return sum;
+ }
+
+ // ๋จ์์๋ ์ผ์ ๋ฉ์ด๋ฆฌ์ ๊ฐ์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ DFS
+ public static int findMax() {
+ visited = new boolean[len][len];
+
+ for (int i = 0; i < len; i++) {
+ for (int j = 0; j < len; j++) {
+ if (arr[i][j] != 0 && !visited[i][j]) {
+ visited[i][j] = true;
+ mass.add(1);
+ dfs(i, j);
+ }
+ }
+ }
+
+ return mass.size() != 0 ? Collections.max(mass) : 0;
+ }
+
+ // DFS
+ public static void dfs(int x, int y) {
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= len || ny >= len) {
+ continue;
+ }
+
+ if (!visited[nx][ny] && arr[nx][ny] > 0) {
+ mass.set(mass.size()-1, mass.get(mass.size()-1)+1);
+ visited[nx][ny] = true;
+ dfs(nx, ny);
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_21924.java b/java/BOJ/Gold/IV/G4_21924.java
new file mode 100644
index 0000000..186b13c
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_21924.java
@@ -0,0 +1,137 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/21924
+ *
+ * ? ์ ๋ชฉ: ๋์ ๊ฑด์ค
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ฑ์์ด๋ ์ ๋์์ ๊ฑด๋ฌผ ์ฌ์ด๋ฅผ ์๋ ์๋ฐฉํฅ ๋๋ก๋ฅผ ๋ง๋ค๋ ค๋ ๊ณต์ฌ ๊ณํ์ ์ธ์ ๋ค.
+ * ๊ณต์ฌ ๊ณํ์ ๊ฒํ ํ๋ฉด์ ๋น์ฉ์ด ์๊ฐ๋ณด๋ค ๋ง์ด ๋๋ ๊ฒ์ ํ์ธํ๋ค.
+ * ์ฑ์์ด๋ ๊ณต์ฌํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ์๋ผ๋ ค๊ณ ํ๋ค.
+ * ๋ชจ๋ ๊ฑด๋ฌผ์ด ๋๋ก๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋๋ก ์ต์ํ์ ๋๋ก๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.*
+ * ์ ๊ทธ๋ฆผ์์ ๊ฑด๋ฌผ๊ณผ ์ง์ ์ผ๋ก ํ์๋ ๋๋ก, ํด๋น ๋๋ก๋ฅผ ๋ง๋ค ๋ ๋๋ ๋น์ฉ์ ํ์ํด๋์ ์ง๋์ด๋ค.*
+ * ๊ทธ๋ฆผ์ ์๋ ๋๋ก๋ฅผ ๋ค ์ค์นํ ๋ ๋๋ ๋น์ฉ์ 62์ด๋ค. ๋ชจ๋ ๊ฑด๋ฌผ์ ์ฐ๊ฒฐํ๋ ๋๋ก๋ง ๋ง๋๋ ๋น์ฉ์ 27๋ก ์ ์ฝํ๋ ๋น์ฉ์ 35์ด๋ค.
+ * ์ฑ์์ด๋ ๋๋ก๊ฐ ๋๋ฌด ๋ง์ ์ ์ฝ๋๋ ๊ธ์ก์ ๊ณ์ฐํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ค.
+ * ์ฑ์์ด๋ฅผ ๋์ ํด ์ผ๋ง๋ ์ ์ฝ์ด ๋๋์ง ๊ณ์ฐํด์ฃผ์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ๊ฑด๋ฌผ์ ๊ฐ์ $N$ $(3 \le N \le 10^5 )$์ ๋๋ก์ ๊ฐ์ $M$
+ * $(2 \le M \le min( {N(N-1) \over 2}, 5ร10^5)) $๊ฐ ์ฃผ์ด์ง๋ค.
+ * ๋ ๋ฒ์งธ ์ค ๋ถํฐ $M + 1$์ค๊น์ง ๊ฑด๋ฌผ์ ๋ฒํธ $a$, $b$ $(1 \le a, b \le N, a โ b)$์ ๋ ๊ฑด๋ฌผ ์ฌ์ด ๋๋ก๋ฅผ ๋ง๋ค ๋ ๋๋ ๋น์ฉ $c (1 \le c \le 10^6)$๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ์ ์์ ๊ฑด๋ฌผ์ ์ฐ๊ฒฐํ๋ ๋ ๋๋ก๋ ์ฃผ์ด์ง์ง ์๋๋ค.
+ *
+ * 7 9 -> n m
+ * 1 2 15 -> a b c
+ * 2 3 7 -> a b c
+ * 1 3 3 -> a b c
+ * 1 4 8 -> a b c
+ * 3 5 6 -> a b c
+ * 4 5 4 -> a b c
+ * 4 6 12 -> a b c
+ * 5 7 1 -> a b c
+ * 6 7 6 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ์์ฐ์ ์ผ๋ง๋ ์ ์ฝ ํ ์ ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋ชจ๋ ๊ฑด๋ฌผ์ด ์ฐ๊ฒฐ๋์ด ์์ง ์๋๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 35
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 1.240์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 190MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G4_21924 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m;
+ static long totalCost;
+ static int[] parent;
+ static ArrayList list;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ long cost = kruskal();
+ if (cost == -1) {
+ System.out.println(-1);
+ } else {
+ System.out.println(totalCost - cost);
+ }
+ }
+
+ public static long kruskal() {
+ int count = 0;
+ long cost = 0;
+
+ for (int i = 0; i < m; i++) {
+ if (count == n-1) {
+ break;
+ }
+
+ int[] road = list.get(i);
+
+ if (union(road[0], road[1])) {
+ count++;
+ cost += road[2];
+ }
+ }
+
+ return count == n-1 ? cost : -1;
+ }
+
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ public static boolean union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a == b) {
+ return false;
+ }
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ return true;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ totalCost = 0;
+
+ list = new ArrayList<>();
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ list.add(new int[] {a, b, c});
+ totalCost += c;
+ }
+
+ list.sort((a, b) -> a[2] - b[2]);
+ parent = IntStream.range(0, n+1).toArray();
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_2239.java b/java/BOJ/Gold/IV/G4_2239.java
new file mode 100644
index 0000000..d28d09f
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_2239.java
@@ -0,0 +1,144 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2239
+ *
+ * ? ์ ๋ชฉ: ์ค๋์ฟ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ค๋์ฟ ๋ ๋งค์ฐ ๊ฐ๋จํ ์ซ์ ํผ์ฆ์ด๋ค. 9ร9 ํฌ๊ธฐ์ ๋ณด๋๊ฐ ์์ ๋, ๊ฐ ํ๊ณผ ๊ฐ ์ด, ๊ทธ๋ฆฌ๊ณ 9๊ฐ์ 3ร3 ํฌ๊ธฐ์ ๋ณด๋์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋ํ๋๋๋ก ๋ณด๋๋ฅผ ์ฑ์ฐ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ๋ณด์.
+ * ์ ๊ทธ๋ฆผ์ ์ฐธ ์๋ ์ค๋์ฟ ํผ์ฆ์ ํผ ๊ฒฝ์ฐ์ด๋ค. ๊ฐ ํ์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋์ค๊ณ , ๊ฐ ์ด์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋์ค๊ณ , ๊ฐ 3ร3์ง๋ฆฌ ์ฌ๊ฐํ(9๊ฐ์ด๋ฉฐ, ์์์ ์๊น๋ก ํ์๋์๋ค)์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋์ค๊ธฐ ๋๋ฌธ์ด๋ค.
+ * ํ๋ค ๋ง ์ค๋์ฟ ํผ์ฆ์ด ์ฃผ์ด์ก์ ๋, ๋ง์ ๋๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * 9๊ฐ์ ์ค์ 9๊ฐ์ ์ซ์๋ก ๋ณด๋๊ฐ ์
๋ ฅ๋๋ค. ์์ง ์ซ์๊ฐ ์ฑ์์ง์ง ์์ ์นธ์๋ 0์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 103000509 -> arr[0][0] ~ arr[0][8]
+ * 002109400
+ * 000704000
+ * 300502006
+ * 060000050
+ * 700803004
+ * 000401000
+ * 009205800
+ * 804000107 -> arr[8][0] ~ arr[8][8]
+ *
+ * ? ์ถ๋ ฅ
+ * 9๊ฐ์ ์ค์ 9๊ฐ์ ์ซ์๋ก ๋ต์ ์ถ๋ ฅํ๋ค. ๋ต์ด ์ฌ๋ฌ ๊ฐ ์๋ค๋ฉด ๊ทธ ์ค ์ฌ์ ์์ผ๋ก ์์๋ ๊ฒ์ ์ถ๋ ฅํ๋ค. ์ฆ, 81์๋ฆฌ์ ์๊ฐ ์ ์ผ ์์ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 143628579
+ * 572139468
+ * 986754231
+ * 391542786
+ * 468917352
+ * 725863914
+ * 237481695
+ * 619275843
+ * 854396127
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.384์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 133MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.ArrayList;
+
+public class G4_2239 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ
+ static int[][] arr = new int[9][9];
+
+ // * ์ด๊ธฐ ์ค์
+ static ArrayList blanks = new ArrayList<>();
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ backTracking(0); // * 2. ๋ฐฑํธ๋ํน ํ ์ฑ๊ณต์ฌ๋ก ๋์ค์๋ง์ ์ถ๋ ฅ
+ }
+
+ // ๋ฐฑํธ๋ํน
+ public static void backTracking(int len) throws IOException {
+ // * ๋น์นธ์ธ ๊ณณ์ ๋ชจ๋ ์ฑ์ฐ๊ธฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ
+ if (len == blanks.size()) {
+ print();
+ System.exit(0);
+ }
+
+ boolean[] nums = new boolean[10];
+ int curX = blanks.get(len)[0];
+ int curY = blanks.get(len)[1];
+
+ // * ๊ฐ๋ก & ์ธ๋ก์ ์๋ ์ซ์๋ค ์ ๊ฑฐ
+ for (int i = 0; i < 9; i++) {
+ if (arr[curX][i] != 0) {
+ nums[arr[curX][i]] = true;
+ }
+
+ if (arr[i][curY] != 0) {
+ nums[arr[i][curY]] = true;
+ }
+ }
+
+ // * ๊ฐ์ 3x3 ๋ค๋ชจ์นธ์ ์๋ ์ซ์๋ค ์ ๊ฑฐ
+ int startX = (curX / 3) * 3;
+ int startY = (curY / 3) * 3;
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ if (arr[startX+i][startY+j] != 0) {
+ nums[arr[startX+i][startY+j]] = true;
+ }
+ }
+ }
+
+ // * ์ ๊ฑฐ๋๊ณ ๋จ์์๋ ์ซ์๋ค์ for ๋ฌธ์ ๋๋ ค์ ๋ฐฑํธ๋ํน
+ for (int i = 1; i < 10; i++) {
+ if (!nums[i]) {
+ arr[curX][curY] = i;
+ backTracking(len+1);
+ arr[curX][curY] = 0;
+ }
+ }
+
+ }
+
+ // ์ค๋์ฟ ๋ฐฐ์ด ์ถ๋ ฅ
+ public static void print() throws IOException {
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ sb.append(arr[i][j]);
+ }
+ sb.append("\n");
+ }
+
+ bw.write(sb.toString());
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ for (int i = 0; i < 9; i++) {
+ char[] line = br.readLine().toCharArray();
+ for (int j = 0; j < 9; j++) {
+ arr[i][j] = line[j] - '0';
+
+ if (arr[i][j] == 0) {
+ blanks.add(new int[] {i, j});
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/java/BOJ/Gold/IV/G4_2617.java b/java/BOJ/Gold/IV/G4_2617.java
new file mode 100644
index 0000000..4f31696
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_2617.java
@@ -0,0 +1,110 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2617
+ *
+ * ? ์ ๋ชฉ: ๊ตฌ์ฌ ์ฐพ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ชจ์์ ๊ฐ์ผ๋, ๋ฌด๊ฒ๊ฐ ๋ชจ๋ ๋ค๋ฅธ N๊ฐ์ ๊ตฌ์ฌ์ด ์๋ค. N์ ํ์์ด๋ฉฐ, ๊ตฌ์ฌ์๋ ๋ฒํธ๊ฐ 1,2,...,N์ผ๋ก ๋ถ์ด ์๋ค. ์ด ๊ตฌ์ฌ ์ค์์ ๋ฌด๊ฒ๊ฐ ์ ์ฒด์ ์ค๊ฐ์ธ (๋ฌด๊ฒ ์์๋ก (N+1)/2๋ฒ์งธ) ๊ตฌ์ฌ์ ์ฐพ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ ์ผ์ ํ๋ ค ํ๋ค.
+ * ์ฐ๋ฆฌ์๊ฒ ์ฃผ์ด์ง ๊ฒ์ ์ํ ์ ์ธ์ด๋ค. ํ ์์ ๊ตฌ์ฌ์ ๊ณจ๋ผ์ ์ํ ์ ์ธ์ ์์ชฝ์ ํ๋์ฉ ์ฌ๋ ค ๋ณด๋ฉด ์ด๋ ์ชฝ์ด ๋ฌด๊ฑฐ์ด๊ฐ๋ฅผ ์ ์ ์๋ค. ์ด๋ ๊ฒ M๊ฐ์ ์์ ๊ณจ๋ผ์ ๊ฐ๊ฐ ์ํ ์ ์ธ์ ์ฌ๋ ค์ ์ด๋ ๊ฒ์ด ๋ฌด๊ฑฐ์ด๊ฐ๋ฅผ ๋ชจ๋ ์์๋๋ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํ์ฌ ๋ฌด๊ฒ๊ฐ ์ค๊ฐ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์ ํ ์๋ ๊ตฌ์ฌ๋ค์ ๋จผ์ ์ ์ธํ๋ค.
+ * ์๋ฅผ ๋ค์ด, N=5์ด๊ณ , M=4 ์์ ๊ตฌ์ฌ์ ๋ํด์ ์ด๋ ์ชฝ์ด ๋ฌด๊ฑฐ์ด๊ฐ๋ฅผ ์์๋ธ ๊ฒฐ๊ณผ๊ฐ ์๋์ ์๋ค.
+ *
+ * ๊ตฌ์ฌ 2๋ฒ์ด ๊ตฌ์ฌ 1๋ฒ๋ณด๋ค ๋ฌด๊ฒ๋ค.
+ * ๊ตฌ์ฌ 4๋ฒ์ด ๊ตฌ์ฌ 3๋ฒ๋ณด๋ค ๋ฌด๊ฒ๋ค.
+ * ๊ตฌ์ฌ 5๋ฒ์ด ๊ตฌ์ฌ 1๋ฒ๋ณด๋ค ๋ฌด๊ฒ๋ค.
+ * ๊ตฌ์ฌ 4๋ฒ์ด ๊ตฌ์ฌ 2๋ฒ๋ณด๋ค ๋ฌด๊ฒ๋ค.
+ *
+ * ์์ ๊ฐ์ด ๋ค ๊ฐ์ ๊ฒฐ๊ณผ๋ง์ ์๊ณ ์์ผ๋ฉด, ๋ฌด๊ฒ๊ฐ ์ค๊ฐ์ธ ๊ตฌ์ฌ์ ์ ํํ๊ฒ ์ฐพ์ ์๋ ์์ง๋ง, 1๋ฒ ๊ตฌ์ฌ๊ณผ 4๋ฒ ๊ตฌ์ฌ์ ๋ฌด๊ฒ๊ฐ ์ค๊ฐ์ธ ๊ตฌ์ฌ์ด ์ ๋ ๋ ์ ์๋ค๋ ๊ฒ์ ํ์คํ ์ ์ ์๋ค. 1๋ฒ ๊ตฌ์ฌ๋ณด๋ค ๋ฌด๊ฑฐ์ด ๊ฒ์ด 2, 4, 5๋ฒ ๊ตฌ์ฌ์ด๊ณ , 4๋ฒ ๋ณด๋ค ๊ฐ๋ฒผ์ด ๊ฒ์ด 1, 2, 3๋ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ต์ 2๊ฐ์ด๋ค.
+ * M ๊ฐ์ ์์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ฌด๊ฒ๊ฐ ์ค๊ฐ์ธ ๊ตฌ์ฌ์ด ๋ ์ ์๋ ๊ตฌ์ฌ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ์ค์ ๊ตฌ์ฌ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ N(1 โค N โค 99)๊ณผ ์ ์ธ์ ์ฌ๋ ค ๋ณธ ์์ ๊ฐ์ M(1 โค M โค N(N-1)/2)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ M ๊ฐ์ ์ค์ ๊ฐ ์ค๋ง๋ค ๋ ๊ฐ์ ๊ตฌ์ฌ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ ๋ฒํธ์ ๊ตฌ์ฌ์ด ๋ค ๋ฒํธ์ ๊ตฌ์ฌ๋ณด๋ค ๋ฌด๊ฒ๋ค๋ ๊ฒ์ ๋ปํ๋ค.
+ *
+ * 5 4 -> n m
+ * 2 1 -> a b
+ * 4 3 -> a b
+ * 5 1 -> a b
+ * 4 2 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ์ค์ ๋ฌด๊ฒ๊ฐ ์ค๊ฐ์ด ์ ๋๋ก ๋ ์ ์๋ ๊ตฌ์ฌ์ ์๋ฅผ ์ถ๋ ฅ ํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.148์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 13MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G4_2617 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ public static void main(String[] args) throws IOException {
+ int answer = 0;
+
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ st = new StringTokenizer(br.readLine());
+ int n = Integer.parseInt(st.nextToken());
+ int m = Integer.parseInt(st.nextToken());
+
+ int[][] arr = new int[n+1][n+1];
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ arr[a][b] = 1;
+ arr[b][a] = 2;
+ }
+
+ // * 2. ํ๋ก์ด๋-์์ฌ
+ for (int k = 1; k <= n; k++) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (k == i || i == j) {
+ continue;
+ }
+
+ if (arr[i][k] == 1 && arr[k][j] == 1) {
+ arr[i][j] = 1;
+ } else if (arr[i][k] == 2 && arr[k][j] == 2) {
+ arr[i][j] = 2;
+ }
+ }
+ }
+ }
+
+ // * 3. ๋ณธ์ธ๋ณด๋ค ๋ฌด๊ฒ๊ฑฐ๋ ๊ฐ๋ฒผ์ด๊ฒ๋ค์ ๊ฐฏ์๊ฐ ๋ฐ์ ๋์ด๊ฐ ๊ฒฝ์ฐ ์นด์ดํธ+1
+ for (int i = 1; i <= n; i++) {
+ int c1 = 0;
+ int c2 = 0;
+
+ for (int j = 1; j <= n; j++) {
+ if (arr[i][j] == 1) {
+ c1++;
+ } else if (arr[i][j] == 2) {
+ c2++;
+ }
+ }
+
+ if (c1 >= (n/2) + 1 || c2 >= (n/2) + 1) {
+ answer++;
+ }
+ }
+
+ // * 4. ์ถ๋ ฅ
+ System.out.println(answer);
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_2631.java b/java/BOJ/Gold/IV/G4_2631.java
new file mode 100644
index 0000000..244a228
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_2631.java
@@ -0,0 +1,118 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2631
+ *
+ * ? ์ ๋ชฉ: ์ค์ธ์ฐ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ?๋ฌธ์
+ * KOI ์ด๋ฆฐ์ด์ง์๋ N๋ช
์ ์์ด๋ค์ด ์๋ค. ์ค๋์ ์ํ์ ๊ฐ๋ ๋ ์ด๋ค. ์ ์๋์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ์ ํ์๋ ๋ฒํธํ๋ฅผ ์์ด๋ค์ ๊ฐ์ด์ ๋ถ์ฌ์ฃผ์๋ค. ์ ์๋์ ์์ด๋ค์ ํจ๊ณผ์ ์ผ๋ก ๋ณดํธํ๊ธฐ ์ํด ๋ชฉ์ ์ง๊น์ง ๋ฒํธ์์๋๋ก ์ผ๋ ฌ๋ก ์์ ๊ฑธ์ด๊ฐ๋๋ก ํ์๋ค. ์ด๋ ๋์ค์ ๋ณด๋ ์์ด๋ค์ ๋ฒํธ์์๊ฐ ๋ฐ๋์๋ค. ๊ทธ๋์ ์ ์๋์ ๋ค์ ๋ฒํธ ์์๋๋ก ์ค์ ์ธ์ฐ๊ธฐ ์ํด์ ์์ด๋ค์ ์์น๋ฅผ ์ฎ๊ธฐ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ด๋ค์ด ํผ๋์ค๋ฌ์ํ์ง ์๋๋ก ํ๊ธฐ ์ํด ์์น๋ฅผ ์ฎ๊ธฐ๋ ์์ด๋ค์ ์๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, 7๋ช
์ ์์ด๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์์๋๋ก ์ค์ ์ ์๋ค๊ณ ํ์.
+ *
+ * 3 7 5 2 6 1 4
+ *
+ * ์์ด๋ค์ ์์๋๋ก ์ค์ ์ธ์ฐ๊ธฐ ์ํด, ๋จผ์ 4๋ฒ ์์ด๋ฅผ 7๋ฒ ์์ด์ ๋ค๋ก ์ฎ๊ฒจ๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์๊ฐ ๋๋ค.
+ *
+ * 3 7 4 5 2 6 1
+ *
+ * ์ด์ , 7๋ฒ ์์ด๋ฅผ ๋งจ ๋ค๋ก ์ฎ๊ธด๋ค.
+ *
+ * 3 4 5 2 6 1 7
+ *
+ * ๋ค์ 1๋ฒ ์์ด๋ฅผ ๋งจ ์์ผ๋ก ์ฎ๊ธด๋ค.
+ *
+ * 1 3 4 5 2 6 7
+ *
+ * ๋ง์ง๋ง์ผ๋ก 2๋ฒ ์์ด๋ฅผ 1๋ฒ ์์ด์ ๋ค๋ก ์ฎ๊ธฐ๋ฉด ๋ฒํธ ์์๋๋ก ๋ฐฐ์น๋๋ค.
+ *
+ * 1 2 3 4 5 6 7
+ *
+ * ์์ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ 4๋ช
์ ์์ด๋ฅผ ์ฎ๊ฒจ ๋ฒํธ ์์๋๋ก ์ค์ ์ธ์ด๋ค. ์์ ์์์ 3๋ช
์ ์์ด๋ง์ ์ฎ๊ฒจ์๋ ์์๋๋ก ๋ฐฐ์นํ ์๊ฐ ์๋ค. ๋ฐ๋ผ์, 4๋ช
์ ์ฎ๊ธฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ์ ์์ ์์ด๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ด๋ค.*
+ * N๋ช
์ ์์ด๋ค์ด ์์์ ์์๋ก ์ค์ ์ ์์ ๋, ๋ฒํธ ์์๋๋ก ๋ฐฐ์นํ๊ธฐ ์ํด ์ฎ๊ฒจ์ง๋ ์์ด์ ์ต์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์์ด๋ค์ ์ N์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ๋ 1๋ถํฐ N๊น์ง์ ์ซ์๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. N์ 2 ์ด์ 200 ์ดํ์ ์ ์์ด๋ค.
+ *
+ * 7 -> n
+ * 3 -> arr[0]
+ * 7
+ * 5
+ * 2
+ * 6
+ * 1
+ * 4 -> arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์๋ ๋ฒํธ ์์๋๋ก ์ค์ ์ธ์ฐ๋๋ฐ ์ฎ๊ฒจ์ง๋ ์์ด๋ค์ ์ต์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.084์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.IV;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class G4_2631 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. LIS
+ int p = 1;
+ dp[0] = arr[0];
+
+ for (int i = 1; i < n; i++) {
+ if (arr[i] > dp[p-1]) {
+ dp[p++] = arr[i];
+ } else {
+ int left = 0;
+ int right = p-1;
+
+ while (left < right) {
+ int mid = (left + right) / 2;
+
+ if (dp[mid] == arr[i]) {
+ left = mid;
+ break;
+ } else if (dp[mid] > arr[i]) {
+ right = mid-1;
+ } else {
+ left = mid+1;
+ }
+ }
+
+ dp[left] = arr[i];
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ(์ ์ฒด ๊ธธ์ด์์ LIS ๊ธธ์ด๋ฅผ ๋บ ๊ฐ์ ์ถ๋ ฅ)
+ System.out.println(n - p);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ dp = new int[n];
+ arr = new int[n];
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(br.readLine());
+ }
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_3584.java b/java/BOJ/Gold/IV/G4_3584.java
new file mode 100644
index 0000000..6734c95
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_3584.java
@@ -0,0 +1,123 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/3584
+ *
+ * ! ์ ๋ชฉ: ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * ๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ(rooted tree)๊ฐ ์ฃผ์ด์ง๊ณ , ๊ทธ ํธ๋ฆฌ ์์ ๋ ์ ์ ์ด ์ฃผ์ด์ง ๋ ๊ทธ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์(Nearest Common Anscestor)์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
+ * ๋ ๋
ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์, ๋ ๋
ธ๋๋ฅผ ๋ชจ๋ ์์์ผ๋ก ๊ฐ์ง๋ฉด์ ๊น์ด๊ฐ ๊ฐ์ฅ ๊น์(์ฆ ๋ ๋
ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด) ๋
ธ๋๋ฅผ ๋งํฉ๋๋ค.
+ * ์๋ฅผ ๋ค์ด 15์ 11๋ฅผ ๋ชจ๋ ์์์ผ๋ก ๊ฐ๋ ๋
ธ๋๋ 4์ 8์ด ์์ง๋ง, ๊ทธ ์ค ๊น์ด๊ฐ ๊ฐ์ฅ ๊น์(15์ 11์ ๊ฐ์ฅ ๊ฐ๊น์ด) ๋
ธ๋๋ 4 ์ด๋ฏ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ 4๊ฐ ๋ฉ๋๋ค.
+ * ๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๊ณ , ๋ ๋
ธ๋๊ฐ ์ฃผ์ด์ง ๋ ๊ทธ ๋ ๋
ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋๋ค.
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค, ์ฒซ์งธ ์ค์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋
ธ๋์ ์ N์ด ์ฃผ์ด์ง๋๋ค. (2 โค N โค 10,000)
+ * ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์ N-1๊ฐ์ ์ค์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ค. ํ ๊ฐ์ ๋น ํ ์ค์ ๋ ๊ฐ์ ์ซ์ A B ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋๋ฐ, ์ด๋ A๊ฐ B์ ๋ถ๋ชจ๋ผ๋ ๋ป์
๋๋ค. (๋น์ฐํ ์ ์ ์ด N๊ฐ์ธ ํธ๋ฆฌ๋ ํญ์ N-1๊ฐ์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค!) A์ B๋ 1 ์ด์ N ์ดํ์ ์ ์๋ก ์ด๋ฆ ๋ถ์ฌ์ง๋๋ค.
+ * ํ
์คํธ ์ผ์ด์ค์ ๋ง์ง๋ง ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ๊ตฌํ ๋ ๋
ธ๋๊ฐ ์ฃผ์ด์ง๋๋ค.
+ *
+ * 2 -> t
+ * 16 -> n
+ * 1 14 -> a b
+ * 8 5 -> a b
+ * 10 16 -> a b
+ * 5 9 -> a b
+ * 4 6 -> a b
+ * 8 4 -> a b
+ * 4 10 -> a b
+ * 1 13 -> a b
+ * 6 15 -> a b
+ * 10 11 -> a b
+ * 6 7 -> a b
+ * 10 2 -> a b
+ * 16 3 -> a b
+ * 8 1 -> a b
+ * 16 12 -> a b
+ * 16 7 -> node1 node2
+ * 5 -> n
+ * 2 3 -> a b
+ * 3 4 -> a b
+ * 3 1 -> a b
+ * 1 5 -> a b
+ * 3 5 -> node1 node2
+ *
+ * ! ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค ๋ณ๋ก, ์ฒซ ์ค์ ์
๋ ฅ์์ ์ฃผ์ด์ง ๋ ๋
ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ถ๋ ฅํฉ๋๋ค.
+ *
+ * 4
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 200ms
+ * ๋ฉ๋ชจ๋ฆฌ: 22544KB
+ * ์ธ์ด: JAVA8
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G4_3584 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ์ด๊ธฐ ์ค์
+ static int n, arr[], node1, node2;
+
+ // * ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine()); // ํ
์คํธ ์ผ์ด์ค ๊ฐฏ์
+
+ // ๊ฐ ํ
์คํธ์ผ์ด์ค๋งํผ ๋ฐ๋ณต
+ for (int i = 0; i < t; i++) {
+ input(); // ์
๋ ฅ ๋ฐ๊ธฐ
+ int result = findParent(node1, node2); // * ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต์กฐ์ ์ฐพ๊ธฐ
+ bw.write(String.valueOf(result + "\n")); // ์ถ๋ ฅ
+ }
+
+ // * ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // * ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต์กฐ์ ์ฐพ๊ธฐ
+ public static int findParent(int a, int b) {
+ boolean[] visited = new boolean[n+1]; // * ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ
+
+ // * node1์ ๋ถ๋ชจ๋ค์ ๋ชจ๋ ๋ฐฉ๋ฌธํ์(๋ฃจํธ๋
ธ๋๊น์ง)
+ while (a != 0) {
+ visited[a] = true;
+ a = arr[a];
+ }
+
+ // * node2์ ๋ถ๋ชจ๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น๊ฐ ์๋ค๋ฉด ํด๋น ๋
ธ๋ ๋ฆฌํด
+ while (b != 0) {
+ if (visited[b]) {
+ return b;
+ }
+ b = arr[b];
+ }
+ return -1;
+ }
+
+ // * ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine()); // * ๋
ธ๋ ๊ฐ์
+ arr = new int[n+1]; // * ๋ถ๋ชจ ๋ฐฐ์ด
+ for (int i = 0; i < n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ arr[b] = a; // ! b์ ๋ถ๋ชจ๊ฐ a์์ ํ์
+ }
+
+ // * ๊ณตํต์กฐ์ ์ฐพ์์ผ ํ๋ ๋ ๋
ธ๋
+ st = new StringTokenizer(br.readLine());
+ node1 = Integer.parseInt(st.nextToken());
+ node2 = Integer.parseInt(st.nextToken());
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_4803.java b/java/BOJ/Gold/IV/G4_4803.java
new file mode 100644
index 0000000..c8700c8
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_4803.java
@@ -0,0 +1,158 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/4803
+ *
+ * ? ์ ๋ชฉ: ํธ๋ฆฌ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๊ทธ๋ํ๋ ์ ์ ๊ณผ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ ์ ์ ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด, ๋ ์ ์ ์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ๋ค. ์ฐ๊ฒฐ ์์๋ ๋ชจ๋ ์ ์ ์ด ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ์ ๋ถ๋ถ์งํฉ์ด๋ค. ๊ทธ๋ํ๋ ํ๋ ๋๋ ๊ทธ ์ด์์ ์ฐ๊ฒฐ ์์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ * ํธ๋ฆฌ๋ ์ฌ์ดํด์ด ์๋ ์ฐ๊ฒฐ ์์์ด๋ค. ํธ๋ฆฌ์๋ ์ฌ๋ฌ ์ฑ์ง์ด ์๋ค. ์๋ฅผ ๋ค์ด, ํธ๋ฆฌ๋ ์ ์ ์ด n๊ฐ, ๊ฐ์ ์ด n-1๊ฐ ์๋ค. ๋, ์์์ ๋ ์ ์ ์ ๋ํด์ ๊ฒฝ๋ก๊ฐ ์ ์ผํ๋ค.
+ * ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ํธ๋ฆฌ์ ๊ฐ์๋ฅผ ์ธ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ
์คํธ ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ n โค 500๊ณผ m โค n(n-1)/2์ ๋ง์กฑํ๋ ์ ์ ์ ๊ฐ์ n๊ณผ ๊ฐ์ ์ ๊ฐ์ m์ด ์ฃผ์ด์ง๋ค. ๋ค์ m๊ฐ์ ์ค์๋ ๊ฐ์ ์ ๋ํ๋ด๋ ๋ ๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ์ ๊ฐ์ ์ ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง์ง ์๋๋ค. ์ ์ ์ 1๋ฒ๋ถํฐ n๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. ์
๋ ฅ์ ๋ง์ง๋ง ์ค์๋ 0์ด ๋ ๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 6 3 -> n m
+ * 1 2 -> a b
+ * 2 3 -> a b
+ * 3 4 -> a b
+ * 6 5 -> n m
+ * 1 2 -> a b
+ * 2 3 -> a b
+ * 3 4 -> a b
+ * 4 5 -> a b
+ * 5 6 -> a b
+ * 6 6 -> n m
+ * 1 2 -> a b
+ * 2 3 -> a b
+ * 1 3 -> a b
+ * 4 5 -> a b
+ * 5 6 -> a b
+ * 6 4 -> a b
+ * 0 0 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ทธ๋ํ์ ํธ๋ฆฌ๊ฐ ์๋ค๋ฉด "No trees."๋ฅผ, ํ ๊ฐ๋ผ๋ฉด "There is one tree."๋ฅผ, T๊ฐ(T > 1)๋ผ๋ฉด "A forest of T trees."๋ฅผ ํ
์คํธ ์ผ์ด์ค ๋ฒํธ์ ํจ๊ป ์ถ๋ ฅํ๋ค.
+ *
+ * Case 1: A forest of 3 trees.
+ * Case 2: There is one tree.
+ * Case 3: No trees.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.636์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 72MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.IV;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G4_4803 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static ArrayList[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] parent;
+
+ public static void main(String[] args) throws IOException {
+ StringBuffer sb = new StringBuffer();
+ int t = 0;
+ while (true) { // * ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค
+ t++;
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ if (n == 0 && m == 0) { // * ์ข
๋ฃ ์ผ์ด์ค
+ break;
+ }
+
+ parent = IntStream.range(0, n+1).toArray(); // ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ๊ฒธ ๋ถ๋ชจ๋
ธ๋
+
+ // *** ์ธ์ ๋
ธ๋ ๋ฆฌ์คํธ ๋ฐฐ์ด ์์ฑ & ์ด๊ธฐํ & ์
ํ
+ arr = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ arr[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ arr[a].add(b);
+ arr[b].add(a);
+ }
+
+ // * 2. BFS: ํธ๋ฆฌ์ ๊ฐฏ์ ์ธ๊ธฐ
+ int count = 0;
+ for (int i = 1; i <= n; i++) {
+ if (parent[i] == i) {
+ boolean hasCycle = false; // * ์ฌ์ดํด์ด ๋ฐ์ํ๋์ง ์ฌ๋ถ
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {i, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ for (int next : arr[cur[0]]) {
+ // * ๋ฐ๋ก ์ง์ ์์ ์จ ๋
ธ๋ ์ ์ธ
+ if (next == cur[1]) {
+ continue;
+ }
+
+ if (parent[next] == i) {
+ hasCycle = true;
+ } else {
+ parent[next] = i;
+ queue.add(new int[] {next, cur[0]});
+ }
+ }
+ }
+
+ // ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์์ ๊ฒฝ์ฐ์๋ง count ์ฆ๊ฐ
+ if (!hasCycle) {
+ count++;
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ๊ฐ ์ถ๊ฐ
+ switch (count) {
+ case 0:
+ sb.append("Case " + t + ": " + "No trees.\n");
+ break;
+ case 1:
+ sb.append("Case " + t + ": " + "There is one tree.\n");
+ break;
+ default:
+ sb.append("Case " + t + ": " + "A forest of " + count + " trees.\n");
+ break;
+ }
+ }
+
+ // * 4. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_4811.java b/java/BOJ/Gold/IV/G4_4811.java
new file mode 100644
index 0000000..72587f5
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_4811.java
@@ -0,0 +1,78 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/4811
+ *
+ * ? ์ ๋ชฉ: ์์ฝ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * 70์ธ ๋ฐ์ข
์ ํ ์๋ฒ์ง๋ ๋งค์ผ ๋งค์ผ ์ฝ ๋ฐ์์ ๋จน๋๋ค. ์๋
์ ์์ด๋ ์ข
์ ํ ์๋ฒ์ง์๊ฒ ์ฝ์ด N๊ฐ ๋ด๊ธด ๋ณ์ ์ ๋ฌผ๋ก ์ฃผ์๋ค.
+ * ์ฒซ์งธ ๋ ์ ์ข
์๋ ๋ณ์์ ์ฝ ํ๋๋ฅผ ๊บผ๋ธ๋ค. ๊ทธ ๋ค์, ๊ทธ ์ฝ์ ๋ฐ์ผ๋ก ์ชผ๊ฐ์ ํ ์กฐ๊ฐ์ ๋จน๊ณ , ๋ค๋ฅธ ์กฐ๊ฐ์ ๋ค์ ๋ณ์ ๋ฃ๋๋ค.
+ * ๋ค์ ๋ ๋ถํฐ ์ข
์๋ ๋ณ์์ ์ฝ์ ํ๋ ๊บผ๋ธ๋ค. (์ฝ์ ํ ์กฐ๊ฐ ์ ์ฒด ์ผ ์๋ ์๊ณ , ์ชผ๊ฐ ๋ฐ ์กฐ๊ฐ ์ผ ์๋ ์๋ค) ๋ฐ ์กฐ๊ฐ์ด๋ผ๋ฉด ๊ทธ ์ฝ์ ๋จน๊ณ , ์๋๋ผ๋ฉด ๋ฐ์ ์ชผ๊ฐ์ ํ ์กฐ๊ฐ์ ๋จน๊ณ , ๋ค๋ฅธ ์กฐ๊ฐ์ ๋ค์ ๋ณ์ ๋ฃ๋๋ค.
+ * ์ข
์๋ ์๋
์๊ฒ ํ ์กฐ๊ฐ์ ๊บผ๋ธ ๋ ์๋ W๋ฅผ, ๋ฐ ์กฐ๊ฐ์ ๊บผ๋ธ ๋ ์๋ H ๋ณด๋ธ๋ค. ์๋
๋ ํ ์๋ฒ์ง์๊ฒ ๋ฐ์ ๋ฌธ์๋ฅผ ์ข
์ด์ ๊ธฐ๋กํด ๋๋๋ค. ์ด 2N์ผ์ด ์ง๋๋ฉด ๊ธธ์ด๊ฐ 2N์ธ ๋ฌธ์์ด์ด ๋ง๋ค์ด์ง๊ฒ ๋๋ค. ์ด๋, ๊ฐ๋ฅํ ์๋ก ๋ค๋ฅธ ๋ฌธ์์ด์ ๊ฐ์๋ ์ด ๋ช ๊ฐ์ผ๊น?
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ต๋ 1000๊ฐ์ ํ
์คํธ ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ ํ ์ค์ด๋ฉฐ, ๋ณ์ ๋ค์ด์๋ ์ฝ์ ๊ฐ์ N โค 30 ๊ฐ ์ฃผ์ด์ง๋ค.
+ * ์
๋ ฅ์ ๋ง์ง๋ง ์ค์๋ 0์ด ํ๋ ์ฃผ์ด์ง๋ค.
+ *
+ * 6 -> n
+ * 1 -> n
+ * 4 -> n
+ * 2 -> n
+ * 3 -> n
+ * 30 -> n
+ * 0 -> end
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด์ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 132
+ * 1
+ * 14
+ * 2
+ * 5
+ * 3814986502092304
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.08์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.IV;
+
+import java.io.*;
+
+public class G4_4811 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ public static void main(String[] args) throws IOException {
+ int n = -1;
+
+ StringBuffer sb = new StringBuffer();
+ long[] dp = new long[31];
+ dp[0] = 1;
+ dp[1] = 1;
+ dp[2] = 2;
+
+ for (int i = 3; i <= 30; i++) {
+ long total = 0;
+ for (int j = 0; j < i; j++) {
+ total += (dp[j] * dp[i - j - 1]);
+ }
+ dp[i] = total;
+ }
+
+ while ((n = Integer.parseInt(br.readLine())) != 0) {
+ sb.append(dp[n] + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+}
diff --git a/java/BOJ/Gold/IV/G4_9252.java b/java/BOJ/Gold/IV/G4_9252.java
new file mode 100644
index 0000000..747a9cb
--- /dev/null
+++ b/java/BOJ/Gold/IV/G4_9252.java
@@ -0,0 +1,89 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9252
+ *
+ * ? ์ ๋ชฉ: LCS2
+ * ? ์๊ฐ ์ ํ: 0.1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
+ * ์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ *
+ * ACAYKP -> s1
+ * CAPCAK -> s2
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ, ๋์งธ ์ค์ LCS๋ฅผ ์ถ๋ ฅํ๋ค.
+ * LCS๊ฐ ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๊ณ , LCS์ ๊ธธ์ด๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ๋์งธ ์ค์ ์ถ๋ ฅํ์ง ์๋๋ค.
+ *
+ * 4
+ * ACAK
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.104์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.IV;
+
+import java.io.*;
+
+public class G4_9252 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ static int n1, n2;
+ static char[] s1, s2;
+ static int[][] lcs;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up) : LCS
+ for (int i = 1; i <= n1; i++) {
+ for (int j = 1; j <= n2; j++) {
+ if (s1[i-1] == s2[j-1]) {
+ lcs[i][j] = lcs[i-1][j-1] + 1;
+ } else {
+ lcs[i][j] = Math.max(lcs[i-1][j], lcs[i][j-1]);
+ }
+ }
+ }
+
+ // * 3. LCS ๋ฌธ์์ด ๊ตฌํ๊ธฐ
+ StringBuffer sb = new StringBuffer();
+ int i = n1, j = n2;
+ while (i > 0 && j > 0) {
+ if (lcs[i][j] == lcs[i-1][j]) {
+ i--;
+ } else if (lcs[i][j] == lcs[i][j-1]) {
+ j--;
+ } else {
+ sb.append(s1[i-1]);
+ i--;
+ j--;
+ }
+ }
+
+ // * 4. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(sb.length());
+ if (sb.length() != 0) {
+ System.out.println(sb.reverse().toString());
+ }
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ s1 = br.readLine().toCharArray();
+ s2 = br.readLine().toCharArray();
+
+ n1 = s1.length;
+ n2 = s2.length;
+
+ lcs = new int[n1+1][n2+1];
+ }
+}
diff --git a/java/BOJ/Gold/V/G4_15971.java b/java/BOJ/Gold/V/G4_15971.java
new file mode 100644
index 0000000..2d52621
--- /dev/null
+++ b/java/BOJ/Gold/V/G4_15971.java
@@ -0,0 +1,143 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/15971
+ *
+ * ? ์ ๋ชฉ: ๋ ๋ก๋ด
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * 2018๋
๊ฐ์๋์์ ์๋ก์ด ๋๊ตด์ด ๋ฐ๊ฒฌ๋์๋ค. ์ด ๋๊ตด์๋ ์ด N๊ฐ์ ๋์ ๋ฐฉ์ด ์กด์ฌํ๋ฉฐ ์ข์ ํต๋ก๋ก ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ฐํ์ก๋ค. N๊ฐ์ ๋ฐฉ์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ ๋ฒํธ๋ฅผ ๋ถ์ฌ 1๋ฒ ๋ฐฉ, 2๋ฒ ๋ฐฉ, โฆ, N๋ฒ ๋ฐฉ์ผ๋ก ๋ถ๋ฅธ๋ค. ํต๋ก๋ ์ ํํ N-1๊ฐ๊ฐ ๋ฐ๊ฒฌ๋์๋๋ฐ, ๊ฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ ๋ฐฉ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐ์์ผ ์ฃผ๋ฉฐ ์ค๊ฐ์ ๋ค๋ฅธ ํต๋ก์ ์ด์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ๋ค. ๋ํ ์ด ํต๋ก๋ค์ ์ด์ฉํ์ฌ ์์์ ๋ ๋ฐฉ ์ฌ์ด๋ฅผ ์ด๋ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, ์์์ ๋ ๋ฐฉ ์ฌ์ด๋ฅผ ์ด๋ํ ๋ ๊ฐ์ ํต๋ก๋ฅผ ๋ ๋ฒ ์ด์ ์ง๋์ง ์๋ ๊ฒฝ๋ก๋ ์ ์ผํ ๊ฒ์ผ๋ก ๋ฐํ์ก๋ค.
+ * ์๋ก ๋ฐ๊ฒฌ๋ ๋๊ตด์ ์กฐ์ฌํ๊ธฐ ์ํด ๋๊ตด ํ์ฌ ๋ก๋ด ๋ ๋๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ์๋ค. ๋ ๋ก๋ด์ ์ด๋ค ์์ ์ด ๋๋ฉด ๊ฐ์๊ฐ ํ๋ํ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ํต์ ์ ํด์ผ ํ๋ค. ๋ ๋ก๋ด์ด ์๋ก ํต์ ์ ํ๊ธฐ ์ํด์๋ ๋๊ตด ๋ด์ ๊ฐ์ ํต๋ก ์์ ์์นํด์ผ๋ง ํ๋ค. ์ฐธ๊ณ ๋ก ์์์ ํต๋ก์ ์ ๋์ ์์นํ ๋ ๋ฐฉ๋ค๋ ๊ทธ ํต๋ก ์์ ์์นํด ์๋ค๊ณ ๊ฐ์ฃผํ๋ค.
+ * <๊ทธ๋ฆผ 1> ๋๊ตด ๋ด๋ถ๋ฅผ ๊ฐ๋ตํ ํํํ ๊ทธ๋ฆผ
+ * <๊ทธ๋ฆผ 1>์ ๋ฐฉ์ด 9๊ฐ์ธ ๋๊ตด ๋ด๋ถ๋ฅผ ๊ฐ๋ตํ๊ฒ ๋ํ๋ธ ์์ด๋ค. <๊ทธ๋ฆผ 1>์์ ๋ฐฉ์ ์์ผ๋ก ํํ๋์ด ์์ผ๋ฉฐ ์ ์์ ์๋ ๋ฐฉ ๋ฒํธ์ด๋ค. 8๊ฐ์ ํต๋ก๋ ๋ ์ ์ฌ์ด์ ์ ๋ถ์ผ๋ก ํ์๋์ด ์์ผ๋ฉฐ ๊ทธ ์์ ์ ์ ๊ฐ์ด ํต๋ก์ ๊ธธ์ด์ด๋ค. ์๋ฅผ ๋ค์ด, 5๋ฒ ๋ฐฉ๊ณผ 9๋ฒ ๋ฐฉ ์ฌ์ด์ ๊ธธ์ด๊ฐ 6 ์ธ ํต๋ก๊ฐ ์์์ ์ ์ ์๋ค. ๋ง์ฝ ๋ ๋ก๋ด์ด 1๋ฒ ๋ฐฉ๊ณผ 9๋ฒ ๋ฐฉ์ ์์นํด ์๋ค๋ฉด, ๊ฐ๊ฐ 2๋ฒ ๋ฐฉ๊ณผ 5๋ฒ ๋ฐฉ์ผ๋ก ์ด๋ํ ํ ํต์ ํ ์ ์์ผ๋ฉฐ ์ด๋ ์ด๋ํ ๊ฑฐ๋ฆฌ์ ํฉ์ 14๋ก ์ต์์ด๋ค.
+ * ๋๊ตด ๋ด์ ํต๋ก์ ๋ํ ์ ๋ณด์ ๋ ๋ก๋ด์ ํ์ฌ ์์น๊ฐ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋, ์๋ก ํต์ ํ๊ธฐ ์ํด ์ด๋ํด์ผ ํ๋ ๊ฑฐ๋ฆฌ์ ํฉ์ ์ต์๊ฐ์ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ๋๊ตด์ ๊ฐ ํต๋ก๋ ์ ๋์ ์์นํ ๋ ๋ฐฉ์ ๋ฒํธ์ ๊ทธ ๊ธธ์ด๋ก ์ฃผ์ด์ง๋ค. ๋ ๋ก๋ด์ ์์น๋ ๋ฐฉ ๋ฒํธ๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ํ์ค ์
๋ ฅ์ผ๋ก ๋๊ตด์ ๋ฐฉ์ ๊ฐ์ N๊ณผ ๋ ๋ก๋ด์ด ์์นํ ๋ฐฉ์ ๋ฒํธ๊ฐ ์ธ ๊ฐ์ ์์ ์ ์๋ก ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์ฒซ ์ค์ ์ฃผ์ด์ง๋ค. ์ดํ ๋๊ตด์ ํต๋ก N-1๊ฐ๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ๊ฐ ํต๋ก๋ ์ธ ๊ฐ์ ์์ ์ ์๋ก ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ํ ์ค์ ์ฃผ์ด์ง๋ฉฐ, ์ ๋ ์ ์๋ ํต๋ก์ ์ ๋์ ์์นํ ๋ฐฉ์ ๋ฒํธ๋ฅผ, ์ธ ๋ฒ์งธ ์ ์๋ ๊ทธ ํต๋ก์ ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค.
+ *
+ * 5 1 5 -> n s e
+ * 1 2 1 -> a b c
+ * 2 3 2 -> a b c
+ * 3 4 3 -> a b c
+ * 4 5 4 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ํ์ค ์ถ๋ ฅ์ผ๋ก ๋ ๋ก๋ด์ด ์๋ก ํต์ ํ๊ธฐ ์ํด ํ์ฌ ์์น์์ ์ด๋ํด์ผ ํ๋ ๊ฑฐ๋ฆฌ์ ํฉ์ ์ต์๊ฐ์ ์ ์๋ก ์ถ๋ ฅํ๋ค.
+ *
+ * 6
+ *
+ * ? ์ ํ
+ * ๋ชจ๋ ์๋ธํ์คํฌ์์ 1 โค N โค 100,000์ด๋ฉฐ, ํต๋ก์ ๊ธธ์ด๋ 1,000์ ๋์ง ์๋๋ค.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.588์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 83MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G4_15971 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, s, e;
+ static ArrayList[] adj;
+
+ // * ์ด๊ธฐ ์ค์
+ static int totalLength = 0;
+ static int maxLength = 0;
+ static boolean[] visit; // ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ
+ static int[] before; // ๋ฐฉ๋ฌธํ๊ธฐ ์ ์ ์ง๋์จ ๋
ธ๋์ ๋ฒํธ
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bfs(); // * 2. BFS ์ํ + ๊ฒฝ๋ก ์ ์ฅ
+ findWay(); // * 3. ๊ฒฝ๋ก๋ฅผ ์ญ์ผ๋ก ๋์๊ฐ๋ฉด์ total ๊ธธ์ด์ max ๊ธธ์ด๋ฅผ ๊ตฌํจ
+ bw.write(String.valueOf(totalLength - maxLength)); // * 4. ์ถ๋ ฅ
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // BFS
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {s, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == e) {
+ break;
+ }
+
+ for (int[] next: adj[cur[0]]) {
+ if (!visit[next[0]]) {
+ visit[next[0]] = true;
+ before[next[0]] = cur[0];
+ queue.add(new int[] {next[0], cur[1] + next[1]});
+ }
+ }
+ }
+ }
+
+ // ๊ฒฝ๋ก ์ฐพ๊ธฐ
+ public static void findWay() {
+ Queue queue = new LinkedList<>();
+ queue.add(e);
+
+ while (!queue.isEmpty()) {
+ int cur = queue.poll();
+
+ if (cur == s) {
+ break;
+ }
+
+ for (int[] next : adj[cur]) {
+ if (next[0] == before[cur]) {
+ queue.add(next[0]);
+ maxLength = Math.max(maxLength, next[1]);
+ totalLength += next[1];
+ }
+ }
+ }
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ s = Integer.parseInt(st.nextToken());
+ e = Integer.parseInt(st.nextToken());
+
+ adj = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ adj[i] = new ArrayList<>();
+ }
+
+ for (int i = 1; i <= n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ adj[a].add(new int[] {b, c});
+ adj[b].add(new int[] {a, c});
+ }
+
+ visit = new boolean[n+1];
+ before = new int[n+1];
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_10216.java b/java/BOJ/Gold/V/G5_10216.java
new file mode 100644
index 0000000..39ef485
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_10216.java
@@ -0,0 +1,130 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/10216
+ *
+ * ? ๋ฌธ์ : Count Circle Groups
+ * ? ์๊ฐ ์ ํ: 8์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๋ฐฑ์ค์ด๋ ๊ตญ๋ฐฉ์ ์๋ฌด๋ฅผ ์ํํ๊ธฐ ์ํด ๋ ๋ฌ๋ค. ํน๋
ํ ํ๋ จ์ ๋ฌด์ฌํ ๋ง์น๊ณ ๋์, ์ ๋ง ์ ์๊ฒผ๊ณ ์ฝ๋ฉ๋ ์ํ๋ ๋ฐฑ์ค์ ๊ทธ ํน๊ธฐ๋ฅผ ์ด๋ ค ์ ๊ตฐ์ ์ง์์ ์ํ์ ์ผ๋ก ๋ถ์ํ๋ ์ผ์ ๋งก๊ฒ ๋์๋ค.
+ * 2์ฐจ์ ํ๋ฉด ์์ N๊ณณ์ ์ ๊ตฐ์ ์ง์์ด ์ค์น๋์ด ์๋ค. ๊ฐ ์ ๊ตฐ์ ์ง์๋ค์ ์ง์๋ง๋ค ํ๋์ ํต์ ํ์ ์ค์นํด, i๋ฒ์งธ ์ ๊ตฐ์ ํต์ ํ์ ์ค์น ์์น๋ก๋ถํฐ Ri ์ด๋ด ๊ฑฐ๋ฆฌ์ ํฌํจ๋๋ ๋ชจ๋ ์ง์ญ์ ์์ ์ ํต์ ์์ญ Ai๋ก ๊ฐ์ง๊ฒ ๋๋ค. ๋ง์ฝ ์์์ ํต์ ์์ญ Ai์ Aj๊ฐ ๋ฟ๊ฑฐ๋ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ง์ i์ ์ง์ j๋ ์ง์ ์ ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ๋ค. ๋ฌผ๋ก ์ง์ ์ ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ์ง ์๋๋ผ๋, ์์์ ์ง์ญ i์ j๊ฐ ์ค๊ฐ์ ๋ช ๊ฐ์ ์ง์ ํต์ ์ ๊ฑฐ์ณ์ ์ต์ข
์ ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ๋ค๋ฉด i์ j๋ ์ํธ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณธ๋ค.
+ * ์ ๋ค์ ์๋ฆฌํด์, ์ํธ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ ๋ถ๋๋ผ๋ฆฌ๋ ๊ฒฐ์ง๋ ฅ์๋ ํ ๊ทธ๋ฃน์ฒ๋ผ ํ๋ํ๋ค. ๋ฐฑ์ค์ ์ด๋ฌํ ๊ทธ๋ฃน์ ๊ฐ์๋ฅผ ์์๋ด ์๊ตฐ์ ์ ๋ต์ง์นจ์ ๋์์ ์ฃผ๊ณ ์ ํ๋ค. ๊ตฐ๋์ ๊ฐ์๋ ์ฝ๋ฉํ๋ ๋ถ์ํ ๋ฐฑ์ค์ ์ํด ์ ๊ตฐ์ ํต์ ๋ง ๋ถ์์ ๋์์ฃผ์!
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ ํ์ผ์ ์ฒซ ๋ฒ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ์๋ฅผ ์๋ฏธํ๋ ์์ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์์๋ T๊ฐ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค.
+ * ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค์ ๋ํด์ ์ ๊ตฐ ์ง์์ ์ซ์ N (1 โค N โค 3,000)์ด ์ฃผ์ด์ง๋ค. ์ด์ด์ N์ค์ ๊ฑธ์ณ ์ ๊ตฐ ์ง์์ ์ขํ x, y (0 โค x, y โค 5,000), ๊ทธ๋ฆฌ๊ณ ํด๋น ์ง์์ R (0 โค R โค 5,000)์ด ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ์๋ ๋ชจ๋ ์ ์์ด๋ค.
+ *
+ * 2 -> test
+ * 2 -> n
+ * 0 0 1 -> a b r
+ * 1 0 1 -> a b r
+ * 3 -> ...
+ * 0 0 1
+ * 2 0 1
+ * 10 0 5
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด์ ํ ์ค์ ๊ฑธ์ณ ์ ๊ตฐ ์ง์์ ๊ทธ๋ฃน ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 7.152์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 139MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+class Camp {
+ int num;
+ int x;
+ int y;
+ int r;
+
+ public Camp(int num, int x, int y, int r) {
+ this.num = num;
+ this.x = x;
+ this.y = y;
+ this.r = r;
+ }
+}
+
+public class G5_10216 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static ArrayList list;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[] visit;
+
+ public static void main(String[] args) throws IOException {
+ int test = Integer.parseInt(br.readLine());
+ StringBuffer sb = new StringBuffer();
+
+ for (int t = 0; t < test; t++) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DFS
+ int count = 0;
+ for (int i = 0; i < n; i++) {
+ if (!visit[list.get(i).num]) {
+ count++;
+ visit[list.get(i).num] = true;
+ dfs(list.get(i));
+ }
+ }
+
+ sb.append(count + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // DFS
+ public static void dfs(Camp cur) {
+ for (int i = 0; i < n; i++) {
+ Camp next = list.get(i);
+
+ // ํต์ ๋ฒ์ ๋ด์ ์๋ ์ง์์ด๋ฉด์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๊ณณ์ ๋ํ์ฌ ์ฌ๊ท DFS ์ํ
+ if (!visit[next.num] && isConnected(cur, next)) {
+ visit[next.num] = true;
+ dfs(next);
+ }
+ }
+ }
+
+ public static boolean isConnected(Camp camp1, Camp camp2) {
+ return (camp1.r + camp2.r) * (camp1.r + camp2.r) >= (camp1.x - camp2.x) * (camp1.x - camp2.x) + (camp1.y - camp2.y) * (camp1.y - camp2.y);
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ visit = new boolean[n];
+ list = new ArrayList<>();
+
+ int x, y, r;
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ x = Integer.parseInt(st.nextToken());
+ y = Integer.parseInt(st.nextToken());
+ r = Integer.parseInt(st.nextToken());
+
+ list.add(new Camp(i, x, y, r));
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_11058.java b/java/BOJ/Gold/V/G5_11058.java
new file mode 100644
index 0000000..42c01a0
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_11058.java
@@ -0,0 +1,58 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11058
+ *
+ * ? ๋ฌธ์ : ํฌ๋ฆฌ๋ณด๋
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ํฌ๋ฆฌ๋ณด๋๋ kriii๊ฐ ๋ง๋ ์ ๊ธฐํ ํค๋ณด๋์ด๋ค. ํฌ๋ฆฌ๋ณด๋์๋ ๋ฒํผ์ด 4๊ฐ๋ง ์์ผ๋ฉฐ, ํ๋ ์ญํ ์ ๋ค์๊ณผ ๊ฐ๋ค.
+ * ํ๋ฉด์ A๋ฅผ ์ถ๋ ฅํ๋ค.
+ * Ctrl-A: ํ๋ฉด์ ์ ์ฒด ์ ํํ๋ค
+ * Ctrl-C: ์ ์ฒด ์ ํํ ๋ด์ฉ์ ๋ฒํผ์ ๋ณต์ฌํ๋ค
+ * Ctrl-V: ๋ฒํผ๊ฐ ๋น์ด์์ง ์์ ๊ฒฝ์ฐ์๋ ํ๋ฉด์ ์ถ๋ ฅ๋ ๋ฌธ์์ด์ ๋ฐ๋ก ๋ค์ ๋ฒํผ์ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ๋๋ค.
+ * ํฌ๋ฆฌ๋ณด๋์ ๋ฒํผ์ ์ด N๋ฒ ๋๋ฌ์ ํ๋ฉด์ ์ถ๋ ฅ๋ A๊ฐ์๋ฅผ ์ต๋๋กํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N(1 โค N โค 100)์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 3 -> n
+ *
+ * ? ์ถ๋ ฅ
+ * ํฌ๋ฆฌ๋ณด๋์ ๋ฒํผ์ ์ด N๋ฒ ๋๋ฌ์ ํ๋ฉด์ ์ถ๋ ฅํ ์ ์๋ A ๊ฐ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class G5_11058 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ int n = Integer.parseInt(br.readLine());
+ long[] dp = new long[n+1];
+
+ dp[1] = 1;
+ for (int i = 1; i <= n; i++) {
+ dp[i] = i;
+ for (int j = 2; j <= 5; j++) {
+ if (i - j - 1 > 0) {
+ dp[i] = Math.max(dp[i-(j+1)] * j, dp[i]);
+ }
+ }
+ }
+
+ System.out.println(dp[n]);
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_1240_BFS.java b/java/BOJ/Gold/V/G5_1240_BFS.java
new file mode 100644
index 0000000..90d7352
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_1240_BFS.java
@@ -0,0 +1,120 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1240
+ *
+ * ? ์ ๋ชฉ: ๋
ธ๋์ฌ์ด์ ๊ฑฐ๋ฆฌ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * N(2โคNโค1,000)๊ฐ์ ๋
ธ๋๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๊ณ M(Mโค1,000)๊ฐ์ ๋ ๋
ธ๋ ์์ ์
๋ ฅ๋ฐ์ ๋ ๋ ๋
ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ผ.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋
ธ๋์ ๊ฐ์ N์ด ์
๋ ฅ๋๊ณ ๋ค์ N-1๊ฐ์ ์ค์ ํธ๋ฆฌ ์์ ์ฐ๊ฒฐ๋ ๋ ์ ๊ณผ ๊ฑฐ๋ฆฌ(10,000 ์ดํ์ ์ ์)๋ฅผ ์
๋ ฅ๋ฐ๋๋ค. ๊ทธ ๋ค์ ์ค์๋ ๊ฑฐ๋ฆฌ๋ฅผ ์๊ณ ์ถ์ M๊ฐ์ ๋
ธ๋ ์์ด ํ ์ค์ ํ ์์ฉ ์
๋ ฅ๋๋ค.
+ *
+ * 4 2 -> n m
+ * 2 1 2 -> a b c
+ * 4 3 2
+ * 1 4 3
+ * 1 2 -> a b
+ * 3 2
+ *
+ * ? ์ถ๋ ฅ
+ * M๊ฐ์ ์ค์ ์ฐจ๋ก๋๋ก ์
๋ ฅ๋ฐ์ ๋ ๋
ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ * 7
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.276์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 48MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G5_1240_BFS {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static ArrayList[] arr;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ StringBuffer sb = new StringBuffer();
+
+ // * 2. BFS
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ sb.append(bfs(a, b) + "\n");
+ }
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // * a -> b ๋ก ๊ฐ๋ BFS
+ public static int bfs(int a, int b) {
+ boolean[] visit = new boolean[n+1];
+ Queue queue = new LinkedList<>();
+ visit[a] = true;
+ queue.add(new int[] {a, 0});
+
+ while(!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == b) {
+ return cur[1];
+ }
+
+ for (int[] next : arr[cur[0]]) {
+ if (!visit[next[0]]) {
+ visit[next[0]] = true;
+ queue.add(new int[] {next[0], cur[1] + next[1]});
+ }
+ }
+
+ }
+
+ return -1;
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ arr[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ arr[a].add(new int[] {b, c});
+ arr[b].add(new int[] {a, c});
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_1240_FLOYD.java b/java/BOJ/Gold/V/G5_1240_FLOYD.java
new file mode 100644
index 0000000..6a17ef3
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_1240_FLOYD.java
@@ -0,0 +1,106 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1240
+ *
+ * ? ์ ๋ชฉ: ๋
ธ๋์ฌ์ด์ ๊ฑฐ๋ฆฌ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * N(2โคNโค1,000)๊ฐ์ ๋
ธ๋๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๊ณ M(Mโค1,000)๊ฐ์ ๋ ๋
ธ๋ ์์ ์
๋ ฅ๋ฐ์ ๋ ๋ ๋
ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ผ.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋
ธ๋์ ๊ฐ์ N์ด ์
๋ ฅ๋๊ณ ๋ค์ N-1๊ฐ์ ์ค์ ํธ๋ฆฌ ์์ ์ฐ๊ฒฐ๋ ๋ ์ ๊ณผ ๊ฑฐ๋ฆฌ(10,000 ์ดํ์ ์ ์)๋ฅผ ์
๋ ฅ๋ฐ๋๋ค. ๊ทธ ๋ค์ ์ค์๋ ๊ฑฐ๋ฆฌ๋ฅผ ์๊ณ ์ถ์ M๊ฐ์ ๋
ธ๋ ์์ด ํ ์ค์ ํ ์์ฉ ์
๋ ฅ๋๋ค.
+ *
+ * 4 2 -> n m
+ * 2 1 2 -> a b c
+ * 4 3 2
+ * 1 4 3
+ * 1 2 -> a b
+ * 3 2
+ *
+ * ? ์ถ๋ ฅ
+ * M๊ฐ์ ์ค์ ์ฐจ๋ก๋๋ก ์
๋ ฅ๋ฐ์ ๋ ๋
ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ * 7
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 2.02์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 22MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G5_1240_FLOYD {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[][] arr;
+
+ // * ๊ฑฐ๋ฆฌ ์ต๋๊ฐ
+ static int MAX = 10_000_000;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ํ๋ก์ด๋-์์ฌ
+ for (int k = 1; k <= n; k++) {
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (k == i || k == j) {
+ continue;
+ }
+
+ if (arr[i][j] > arr[i][k] + arr[k][j]) {
+ arr[i][j] = arr[i][k] + arr[k][j];
+ }
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ bw.write(arr[a][b] + "\n");
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n+1][n+1];
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= n; j++) {
+ arr[i][j] = MAX;
+ }
+ }
+
+ for (int i = 0; i < n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ arr[a][b] = c;
+ arr[b][a] = c;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_13398.java b/java/BOJ/Gold/V/G5_13398.java
new file mode 100644
index 0000000..52e8651
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_13398.java
@@ -0,0 +1,92 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง
+ * ? https://www.acmicpc.net/problem/13398
+ *
+ * ? ์ ๋ชฉ: ์ฐ์ํฉ 2
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * n๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์์ ์์ด์ด ์ฃผ์ด์ง๋ค. ์ฐ๋ฆฌ๋ ์ด ์ค ์ฐ์๋ ๋ช ๊ฐ์ ์๋ฅผ ์ ํํด์ ๊ตฌํ ์ ์๋ ํฉ ์ค ๊ฐ์ฅ ํฐ ํฉ์ ๊ตฌํ๋ ค๊ณ ํ๋ค. ๋จ, ์๋ ํ ๊ฐ ์ด์ ์ ํํด์ผ ํ๋ค. ๋, ์์ด์์ ์๋ฅผ ํ๋ ์ ๊ฑฐํ ์ ์๋ค. (์ ๊ฑฐํ์ง ์์๋ ๋๋ค)
+ * ์๋ฅผ ๋ค์ด์ 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 ์ด๋ผ๋ ์์ด์ด ์ฃผ์ด์ก๋ค๊ณ ํ์. ์ฌ๊ธฐ์ ์๋ฅผ ์ ๊ฑฐํ์ง ์์์ ๋์ ์ ๋ต์ 12+21์ธ 33์ด ์ ๋ต์ด ๋๋ค.
+ * ๋ง์ฝ, -35๋ฅผ ์ ๊ฑฐํ๋ค๋ฉด, ์์ด์ 10, -4, 3, 1, 5, 6, 12, 21, -1์ด ๋๊ณ , ์ฌ๊ธฐ์ ์ ๋ต์ 10-4+3+1+5+6+12+21์ธ 54๊ฐ ๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ ์ n(1 โค n โค 100,000)์ด ์ฃผ์ด์ง๊ณ ๋์งธ ์ค์๋ n๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์ฃผ์ด์ง๋ค. ์๋ -1,000๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
+ *
+ * 10 -> n
+ * 10 -4 3 1 5 6 -35 12 21 -1 -> arr[0] ~ arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ต์ ์ถ๋ ฅํ๋ค.
+ *
+ * 54
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.224์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 22MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G5_13398 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int answer;
+ static int[] dp1, dp2;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ // * ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ ์ฐ์ํฉ์ ์ต๋๊ฐ dp
+ answer = arr[0];
+ dp1[0] = arr[0];
+ for (int i = 1; i < n; i++) {
+ dp1[i] = Math.max(dp1[i - 1] + arr[i], arr[i]);
+ answer = Math.max(answer, dp1[i]); // ์ซ์๋ฅผ ์ ๊ฑฐํ์ง ์๋ ๊ฒฝ์ฐ์ max ๊ฐ ์
๋ฐ์ดํธ
+ }
+
+ // * ์ค๋ฅธ์ชฝ -> ์ผ์ชฝ ์ฐ์ํฉ์ ์ต๋๊ฐ dp
+ dp2[n-1] = arr[n-1];
+ for (int i = n - 2; i >= 0; i--) {
+ dp2[i] = Math.max(dp2[i + 1] + arr[i], arr[i]);
+ }
+
+ // * ์ซ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ์ ์ผ์ชฝ -> i <- ์ค๋ฅธ์ชฝ ์ฐ์ํฉ์ ํฉ์ ์ต๋๊ฐ ์
๋ฐ์ดํธ
+ for (int i = 1; i < n-1; i++) {
+ answer = Math.max(answer, dp1[i-1] + dp2[i+1]);
+ }
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(String.valueOf(answer));
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n];
+ dp1 = new int[n];
+ dp2 = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_14284.java b/java/BOJ/Gold/V/G5_14284.java
new file mode 100644
index 0000000..6e80f1c
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_14284.java
@@ -0,0 +1,116 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14284
+ *
+ * ? ์ ๋ชฉ: ๊ฐ์ ์ด์ด๊ฐ๊ธฐ 2
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ ์ n๊ฐ, 0๊ฐ์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ m๊ฐ์ ๊ฐ์ค์น ๊ฐ์ ์ ์ ๋ณด๊ฐ ์๋ ๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ์ ๋ฆฌ์คํธ์ ์๋ ๊ฐ์ ํ๋์ฉ ๊ทธ๋ํ์ ์ถ๊ฐํด ๋๊ฐ ๊ฒ์ด๋ค. ์ด๋, ํน์ ์ ์ s์ t๊ฐ ์ฐ๊ฒฐ์ด ๋๋ ์์ ์์ ๊ฐ์ ์ถ๊ฐ๋ฅผ ๋ฉ์ถ ๊ฒ์ด๋ค. ์ฐ๊ฒฐ์ด๋ ๋ ์ ์ ์ด ๊ฐ์ ์ ํตํด ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๊ฒ์ ๋งํ๋ค.
+ * s์ t๊ฐ ์ฐ๊ฒฐ์ด ๋๋ ์์ ์ ๊ฐ์ ์ ๊ฐ์ค์น์ ํฉ์ด ์ต์๊ฐ ๋๊ฒ ์ถ๊ฐํ๋ ๊ฐ์ ์ ์์๋ฅผ ์กฐ์ ํ ๋, ๊ทธ ์ต์๊ฐ์ ๊ตฌํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ n, ๊ฐ์ ๋ฆฌ์คํธ์ ๊ฐ์ ์ m์ด ์ฃผ์ด์ง๋ค.(2โคnโค5000,1โคmโค100,000)
+ * ๋ค์ m์ค์๋ a,b,c๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ด๋ a์ b๋ c์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง์ ๋งํ๋ค. (1โคa,bโคn,1โคcโค100,aโ b)
+ * ๋ค์ ์ค์๋ ๋ ์ ์ s,t๊ฐ ์ฃผ์ด์ง๋ค. (1โคs,tโคn,sโ t)
+ * ๋ชจ๋ ๊ฐ์ ์ ์ฐ๊ฒฐํ๋ฉด ๊ทธ๋ํ๋ ์ฐ๊ฒฐ ๊ทธ๋ํ๊ฐ ๋จ์ด ๋ณด์ฅ๋๋ค.
+ *
+ * 8 9 -> n m
+ * 1 2 3 -> a b c
+ * 1 3 2 -> a b c
+ * 1 4 4 -> a b c
+ * 2 5 2 -> a b c
+ * 3 6 1 -> a b c
+ * 4 7 3 -> a b c
+ * 5 8 6 -> a b c
+ * 6 8 2 -> a b c
+ * 7 8 7 -> a b c
+ * 1 8 -> s e
+ *
+ * ? ์ถ๋ ฅ
+ * s์ t๊ฐ ์ฐ๊ฒฐ๋๋ ์์ ์ ๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ ์ต์๊ฐ์ ์ถ๋ ฅํ์์ค,
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.5์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 49MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+
+public class G5_14284 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m, s, e;
+ static ArrayList[] list;
+ static int[] visit;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int answer = bfs();
+ System.out.println(answer - 1);
+ }
+
+ public static int bfs() {
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
+ pq.add(new int[]{s, 1});
+ visit[s] = 1;
+
+ while (!pq.isEmpty()) {
+ int[] cur = pq.poll();
+
+ if (visit[cur[0]] != 0 && visit[cur[0]] < cur[1]) {
+ continue;
+ }
+
+ if (cur[0] == e) {
+ return cur[1];
+ }
+
+ for (int[] next : list[cur[0]]) {
+ if (visit[next[0]] == 0 || visit[next[0]] > cur[1] + next[1]) {
+ visit[next[0]] = cur[1] + next[1];
+ pq.add(new int[]{next[0], visit[next[0]]});
+ }
+ }
+ }
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ visit = new int[n + 1];
+ list = new ArrayList[n + 1];
+ for (int i = 1; i <= n; i++) {
+ list[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ list[a].add(new int[]{b, c});
+ list[b].add(new int[]{a, c});
+ }
+
+ st = new StringTokenizer(br.readLine());
+ s = Integer.parseInt(st.nextToken());
+ e = Integer.parseInt(st.nextToken());
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_14395.java b/java/BOJ/Gold/V/G5_14395.java
new file mode 100644
index 0000000..10f885b
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_14395.java
@@ -0,0 +1,117 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14395
+ *
+ * ? ์ ๋ชฉ: 4์ฐ์ฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ ์ s๊ฐ ์ฃผ์ด์ง๋ค. ์ ์ s์ ๊ฐ์ t๋ก ๋ฐ๊พธ๋ ์ต์ ์ฐ์ฐ ํ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ์๋์ ๊ฐ๋ค.
+ *
+ * s = s + s; (์ถ๋ ฅ: +)
+ * s = s - s; (์ถ๋ ฅ: -)
+ * s = s * s; (์ถ๋ ฅ: *)
+ * s = s / s; (์ถ๋ ฅ: /) (s๊ฐ 0์ด ์๋๋๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ s์ t๊ฐ ์ฃผ์ด์ง๋ค. (1 โค s, t โค 109)
+ *
+ * 7 392 -> s t
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ ์ s๋ฅผ t๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ถ๋ ฅํ๋ค. s์ t๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ 0์, ๋ฐ๊ฟ ์ ์๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค. ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ ๊ฐ์ง๋ผ๋ฉด, ์ฌ์ ์์ผ๋ก ์์๋ ๊ฒ์ ์ถ๋ ฅํ๋ค.
+ * ์ฐ์ฐ์ ์์คํค ์ฝ๋ ์์๋ '*', '+', '-', '/' ์ด๋ค.
+ *
+ * +*+
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.124์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 9
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+class NumberFour {
+ long num;
+ String op;
+
+ public NumberFour(long num, String op) {
+ this.num = num;
+ this.op = op;
+ }
+}
+
+public class G5_14395 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ public static void main(String[] args) throws IOException {
+ st = new StringTokenizer(br.readLine());
+ long s = Long.parseLong(st.nextToken());
+ long t = Long.parseLong(st.nextToken());
+
+ HashSet set = new HashSet<>();
+
+ if (s == t) {
+ System.out.println(0);
+ } else if (t == 1) {
+ System.out.println("/");
+ } else {
+ Queue queue = new LinkedList<>();
+ queue.add(new NumberFour(s, ""));
+ boolean find = false;
+
+ while (!queue.isEmpty()) {
+ NumberFour nf = queue.poll();
+
+ if (nf.num == t) {
+ System.out.println(nf.op);
+ find = true;
+ break;
+ }
+
+ long prod = nf.num * nf.num;
+ String prodOp = nf.op + "*";
+
+ long sum = 2 * nf.num;
+ String sumOp = nf.op + "+";
+
+ long div = 1;
+ String divOp = nf.op + "/";
+
+
+ if (!set.contains(prod)) {
+ set.add(prod);
+ queue.add(new NumberFour(prod, prodOp));
+ }
+
+
+ if (!set.contains(sum)) {
+ set.add(sum);
+ queue.add(new NumberFour(sum, sumOp));
+ }
+
+
+ if (!set.contains(div)) {
+ set.add(div);
+ queue.add(new NumberFour(div, divOp));
+ }
+ }
+
+ if (!find) {
+ System.out.println(-1);
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_14567.java b/java/BOJ/Gold/V/G5_14567.java
new file mode 100644
index 0000000..c6563d5
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_14567.java
@@ -0,0 +1,118 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14567
+ *
+ * ? ์ ๋ชฉ: ์ ์๊ณผ๋ชฉ(Prerequisite)
+ * ? ์๊ฐ ์ ํ: 5์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ฌํด Z๋ํ ์ปดํจํฐ๊ณตํ๋ถ์ ์๋ก ์
ํํ ๋ฏผ์ฑ์ด๋ ํ๋ถ์ ๊ฐ์ค๋ ๋ชจ๋ ์ ๊ณต๊ณผ๋ชฉ์ ๋ฃ๊ณ ์กธ์
ํ๋ ค๋ ์๋ํ ๋ชฉํ๋ฅผ ์ธ์ ๋ค. ์ด๋ค ๊ณผ๋ชฉ๋ค์ ์ ์๊ณผ๋ชฉ์ด ์์ด ํด๋น๋๋ ๋ชจ๋ ๊ณผ๋ชฉ์ ๋จผ์ ์ด์ํด์ผ๋ง ํด๋น ๊ณผ๋ชฉ์ ์ด์ํ ์ ์๊ฒ ๋์ด ์๋ค. ๊ณตํ์ธ์ฆ์ ํฌ๊ธฐํ ์ ์๋ ๋ถ์ํ ๋ฏผ์ฑ์ด๋ ์ ์๊ณผ๋ชฉ ์กฐ๊ฑด์ ๋ฐ๋์ ์ง์ผ์ผ๋ง ํ๋ค. ๋ฏผ์ฑ์ด๋ ์ ์๊ณผ๋ชฉ ์กฐ๊ฑด์ ์งํฌ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์ ๊ณต๊ณผ๋ชฉ์ ์ธ์ ์ด์ํ ์ ์๋์ง ๊ถ๊ธํด์ก๋ค. ๊ณ์ฐ์ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์กฐ๊ฑด์ ๊ฐ์ํํ์ฌ ๊ณ์ฐํ๊ธฐ๋ก ํ์๋ค.
+ * ํ ํ๊ธฐ์ ๋ค์ ์ ์๋ ๊ณผ๋ชฉ ์์๋ ์ ํ์ด ์๋ค.
+ * ๋ชจ๋ ๊ณผ๋ชฉ์ ๋งค ํ๊ธฐ ํญ์ ๊ฐ์ค๋๋ค.
+ * ๋ชจ๋ ๊ณผ๋ชฉ์ ๋ํด ๊ฐ ๊ณผ๋ชฉ์ ์ด์ํ๋ ค๋ฉด ์ต์ ๋ช ํ๊ธฐ๊ฐ ๊ฑธ๋ฆฌ๋์ง ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ฌ๋ผ.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ๊ณผ๋ชฉ์ ์ N(1 โค N โค 1000)๊ณผ ์ ์ ์กฐ๊ฑด์ ์ M(0 โค M โค 500000)์ด ์ฃผ์ด์ง๋ค. ์ ์๊ณผ๋ชฉ ์กฐ๊ฑด์ M๊ฐ์ ์ค์ ๊ฑธ์ณ ํ ์ค์ ์ ์ A B ํํ๋ก ์ฃผ์ด์ง๋ค. A๋ฒ ๊ณผ๋ชฉ์ด B๋ฒ ๊ณผ๋ชฉ์ ์ ์๊ณผ๋ชฉ์ด๋ค. A < B์ธ ์
๋ ฅ๋ง ์ฃผ์ด์ง๋ค. (1 โค A < B โค N)
+ *
+ * 3 2 -> n m
+ * 2 3 -> a b
+ * 1 2 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * 1๋ฒ ๊ณผ๋ชฉ๋ถํฐ N๋ฒ ๊ณผ๋ชฉ๊น์ง ์ฐจ๋ก๋๋ก ์ต์ ๋ช ํ๊ธฐ์ ์ด์ํ ์ ์๋์ง๋ฅผ ํ ์ค์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ถ๋ ฅํ๋ค.
+ *
+ * 1 2 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.584์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 130MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G5_14567 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static ArrayList[] adj;
+
+ // * ์ด๊ธฐ ์ค์
+ static boolean[] visit;
+ static int[] degree, sequence;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ์์ ์ ๋ ฌ(BFS)
+ Queue queue = new LinkedList<>();
+ for (int i = 1; i <= n; i++) {
+ if (degree[i] == 0) {
+ queue.add(new int[] {i, 1});
+ visit[i] = true;
+ }
+ }
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+ sequence[cur[0]] = cur[1];
+
+ for (int next: adj[cur[0]]) {
+ if (visit[next]) {
+ continue;
+ }
+
+ if (--degree[next] == 0) {
+ queue.add(new int[] {next, cur[1]+1});
+ visit[next] = true;
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+ for (int i = 1; i <= n; i++) {
+ sb.append(sequence[i] + " ");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ degree = new int[n+1];
+ sequence = new int[n+1];
+ visit = new boolean[n+1];
+ adj = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ adj[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ degree[b]++;
+ adj[a].add(b);
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_15486.java b/java/BOJ/Gold/V/G5_15486.java
new file mode 100644
index 0000000..6183957
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_15486.java
@@ -0,0 +1,99 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/15486
+ *
+ * ? ์ ๋ชฉ: ํด์ฌ 2
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์๋ด์์ผ๋ก ์ผํ๊ณ ์๋ ๋ฐฑ์ค์ด๋ ํด์ฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค.
+ * ์ค๋๋ถํฐ N+1์ผ์งธ ๋๋ ๋ ํด์ฌ๋ฅผ ํ๊ธฐ ์ํด์, ๋จ์ N์ผ ๋์ ์ต๋ํ ๋ง์ ์๋ด์ ํ๋ ค๊ณ ํ๋ค.
+ * ๋ฐฑ์ค์ด๋ ๋น์์๊ฒ ์ต๋ํ ๋ง์ ์๋ด์ ์ก์ผ๋ผ๊ณ ๋ถํ์ ํ๊ณ , ๋น์๋ ํ๋ฃจ์ ํ๋์ฉ ์๋ก ๋ค๋ฅธ ์ฌ๋์ ์๋ด์ ์ก์๋์๋ค.
+ * ๊ฐ๊ฐ์ ์๋ด์ ์๋ด์ ์๋ฃํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ๊ธฐ๊ฐ Ti์ ์๋ด์ ํ์ ๋ ๋ฐ์ ์ ์๋ ๊ธ์ก Pi๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ *
+ * N = 7์ธ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๋ด ์ผ์ ํ๋ฅผ ๋ณด์.
+ *
+ * 1์ผ 2์ผ 3์ผ 4์ผ 5์ผ 6์ผ 7์ผ
+ * Ti 3 5 1 1 2 4 2
+ * Pi 10 20 10 20 15 40 200
+ *
+ * 1์ผ์ ์กํ์๋ ์๋ด์ ์ด 3์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ์๋ดํ์ ๋ ๋ฐ์ ์ ์๋ ๊ธ์ก์ 10์ด๋ค. 5์ผ์ ์กํ์๋ ์๋ด์ ์ด 2์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ฐ์ ์ ์๋ ๊ธ์ก์ 15์ด๋ค.
+ * ์๋ด์ ํ๋๋ฐ ํ์ํ ๊ธฐ๊ฐ์ 1์ผ๋ณด๋ค ํด ์ ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์๋ด์ ํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด์ 1์ผ์ ์๋ด์ ํ๊ฒ ๋๋ฉด, 2์ผ, 3์ผ์ ์๋ ์๋ด์ ํ ์ ์๊ฒ ๋๋ค. 2์ผ์ ์๋ ์๋ด์ ํ๊ฒ ๋๋ฉด, 3, 4, 5, 6์ผ์ ์กํ์๋ ์๋ด์ ํ ์ ์๋ค.
+ * ๋ํ, N+1์ผ์งธ์๋ ํ์ฌ์ ์๊ธฐ ๋๋ฌธ์, 6, 7์ผ์ ์๋ ์๋ด์ ํ ์ ์๋ค.
+ * ํด์ฌ ์ ์ ํ ์ ์๋ ์๋ด์ ์ต๋ ์ด์ต์ 1์ผ, 4์ผ, 5์ผ์ ์๋ ์๋ด์ ํ๋ ๊ฒ์ด๋ฉฐ, ์ด๋์ ์ด์ต์ 10+20+15=45์ด๋ค.
+ * ์๋ด์ ์ ์ ํ ํ์ ๋, ๋ฐฑ์ค์ด๊ฐ ์ป์ ์ ์๋ ์ต๋ ์์ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N (1 โค N โค 1,500,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ Ti์ Pi๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด์ ์ฃผ์ด์ง๋ฉฐ, 1์ผ๋ถํฐ N์ผ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. (1 โค Ti โค 50, 1 โค Pi โค 1,000)
+ *
+ * 7 -> n
+ * 3 10 -> arr[1][0] arr[1][1]
+ * 5 20
+ * 1 10
+ * 1 20
+ * 2 15
+ * 4 40
+ * 2 200 -> arr[n][0] arr[n][1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฐฑ์ค์ด๊ฐ ์ป์ ์ ์๋ ์ต๋ ์ด์ต์ ์ถ๋ ฅํ๋ค.
+ *
+ * 45
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.776์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 342MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G5_15486 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = 0;
+ static int[] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i <= n; i++) {
+ dp[i] = Math.max(dp[i], dp[i - 1]);
+ if (i + arr[i][0] <= n + 1) {
+ dp[i + arr[i][0]] = Math.max(dp[i + arr[i][0]], dp[i] + arr[i][1]);
+ max = Math.max(dp[i + arr[i][0]], max);
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(max);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n + 2][2];
+ dp = new int[n + 2];
+
+ for (int i = 1; i <= n; i++) {
+ st = new StringTokenizer(br.readLine());
+
+ arr[i][0] = Integer.parseInt(st.nextToken());
+ arr[i][1] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_15591.java b/java/BOJ/Gold/V/G5_15591.java
new file mode 100644
index 0000000..eed6d49
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_15591.java
@@ -0,0 +1,128 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/15591
+ *
+ * ? ์ ๋ชฉ: MooTube(Silver)
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ๋๋ถ ์กด์ ๋จ๋ ์๊ฐ์ MooTube๋ผ ๋ถ๋ฆฌ๋ ๋์์ ๊ณต์ ์๋น์ค๋ฅผ ๋ง๋ค์๋ค. MooTube์์ ๋๋ถ ์กด์ ์๋ค์ ์ฌ๋ฐ๋ ๋์์๋ค์ ์๋ก ๊ณต์ ํ ์ ์๋ค. ์๋ค์ MooTube์ 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ์ง N (1 โค N โค 5,000)๊ฐ์ ๋์์์ ์ด๋ฏธ ์ฌ๋ ค ๋์๋ค. ํ์ง๋ง, ์กด์ ์์ง ์ด๋ป๊ฒ ํ๋ฉด ์๋ค์ด ๊ทธ๋ค์ด ์ข์ํ ๋งํ ์ ๋์์์ ์ฐพ์ ์ ์์์ง ๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ์ง ๋ชปํ๋ค.
+ * ๋๋ถ ์กด์ ๋ชจ๋ MooTube ๋์์์ ๋ํด โ์ฐ๊ด ๋์์โ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ธฐ๋ก ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ค์ ์ง๊ธ ๋ณด๊ณ ์๋ ๋์์๊ณผ ์ฐ๊ด์ฑ์ด ๋์ ๋์์์ ์ถ์ฒ ๋ฐ์ ์ ์์ ๊ฒ์ด๋ค.*
+ * ์กด์ ๋ ๋์์์ด ์๋ก ์ผ๋ง๋ ๊ฐ๊น์ด ์ง๋ฅผ ์ธก์ ํ๋ ๋จ์์ธ โUSADOโ๋ฅผ ๋ง๋ค์๋ค. ์กด์ N-1๊ฐ์ ๋์์ ์์ ๊ณจ๋ผ์ ์ง์ ๋ ์์ USADO๋ฅผ ๊ณ์ฐํ๋ค. ๊ทธ ๋ค์์ ์กด์ ์ด ๋์์๋ค์ ๋คํธ์ํฌ ๊ตฌ์กฐ๋ก ๋ฐ๊ฟ์, ๊ฐ ๋์์์ ์ ์ ์ผ๋ก ๋ํ๋ด๊ธฐ๋ก ํ๋ค. ๋ ์กด์ ๋์์๋ค์ ์ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ N-1๊ฐ์ ๋์์ ์์ผ๋ก ๋ํ๋ด์๋ค. ์ข ๋ ์ฝ๊ฒ ๋งํด์, ์กด์ N-1๊ฐ์ ๋์์ ์์ ๊ณจ๋ผ์ ์ด๋ค ๋์์์์ ๋ค๋ฅธ ๋์์์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ๋ฐ๋์ ํ๋ ์กด์ฌํ๋๋ก ํ๋ค. ์กด์ ์์์ ๋ ์ ์ฌ์ด์ ๋์์์ USADO๋ฅผ ๊ทธ ๊ฒฝ๋ก์ ๋ชจ๋ ์ฐ๊ฒฐ๋ค์ USADO ์ค ์ต์๊ฐ์ผ๋ก ํ๊ธฐ๋ก ํ๋ค.
+ * ์กด์ ์ด๋ค ์ฃผ์ด์ง MooTube ๋์์์ ๋ํด, ๊ฐ K๋ฅผ ์ ํด์ ๊ทธ ๋์์๊ณผ USADO๊ฐ K ์ด์์ธ ๋ชจ๋ ๋์์์ด ์ถ์ฒ๋๋๋ก ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์กด์ ๋๋ฌด ๋ง์ ๋์์์ด ์ถ์ฒ๋๋ฉด ์๋ค์ด ์ผํ๋ ๊ฒ์ด ๋ฐฉํด๋ ๊น ๋ด ๊ฑฑ์ ํ๊ณ ์๋ค! ๊ทธ๋์ ๊ทธ๋ K๋ฅผ ์ ์ ํ ๊ฐ์ผ๋ก ๊ฒฐ์ ํ๋ ค๊ณ ํ๋ค. ๋๋ถ ์กด์ ์ด๋ค K ๊ฐ์ ๋ํ ์ถ์ฒ ๋์์์ ๊ฐ์๋ฅผ ๋ฌป๋ ์ง๋ฌธ ์ฌ๋ฌ ๊ฐ์ ๋น์ ์ด ๋๋ตํด์ฃผ๊ธฐ๋ฅผ ๋ฐ๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฒซ ๋ฒ์งธ ์ค์๋ N๊ณผ Q๊ฐ ์ฃผ์ด์ง๋ค. (1 โค Q โค 5,000)
+ * ๋ค์ N-1๊ฐ์ ์ค์๋ ๋๋ถ ์กด์ด ์ง์ ์ฐ ๋ ๋์์ ์์ USADO๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ๊ฐ ์ค์ ์ธ ์ ์ pi, qi, ri (1 โค pi, qi โค N, 1 โค ri โค 1,000,000,000)๋ฅผ ํฌํจํ๋๋ฐ, ์ด๋ ๋์์ pi์ qi๊ฐ USADO ri๋ก ์๋ก ์ฐ๊ฒฐ๋์ด ์์์ ๋ปํ๋ค.
+ * ๋ค์ Q๊ฐ์ ์ค์๋ ๋๋ถ ์กด์ Q๊ฐ์ ์ง๋ฌธ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ค์ ๋ ์ ์ ki์ vi(1 โค ki โค 1,000,000,000, 1 โค vi โค N)์ ํฌํจํ๋๋ฐ, ์ด๋ ์กด์ i๋ฒ์งธ ์ง๋ฌธ์ด ๋ง์ฝ K = ki๋ผ๋ฉด ๋์์ vi๋ฅผ ๋ณด๊ณ ์๋ ์๋ค์๊ฒ ๋ช ๊ฐ์ ๋์์์ด ์ถ์ฒ๋ ์ง ๋ฌป๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋ปํ๋ค.
+ *
+ * 4 3 -> n q
+ * 1 2 3 -> a b c
+ * 2 3 2 -> a b c
+ * 2 4 4 -> a b c
+ * 1 2 -> k v
+ * 4 1 -> k v
+ * 3 1 -> k v
+ *
+ * ? ์ถ๋ ฅ
+ * Q๊ฐ์ ์ค์ ์ถ๋ ฅํ๋ค. i๋ฒ์งธ ์ค์๋ ๋๋ถ ์กด์ i๋ฒ์งธ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์ถ๋ ฅ๋์ด์ผ ํ๋ค.
+ *
+ * 3
+ * 0
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 2.276์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 302MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G5_15591 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, q;
+ static ArrayList[] adj;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] visit;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. BFS
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < q; i++) {
+ st = new StringTokenizer(br.readLine());
+ int k = Integer.parseInt(st.nextToken());
+ int v = Integer.parseInt(st.nextToken());
+
+ bfs(v);
+ int count = 0;
+ for (int j = 1; j <= n; j++) {
+ if (visit[j] >= k) {
+ count++;
+ }
+ }
+ sb.append(count + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ q = Integer.parseInt(st.nextToken());
+
+ adj = new ArrayList[n+1];
+ for (int i = 1; i <= n; i++) {
+ adj[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < n-1; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ adj[a].add(new int[] {b, c});
+ adj[b].add(new int[] {a, c});
+ }
+ }
+
+ public static int bfs(int s) {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {s, Integer.MAX_VALUE});
+ visit = new int[n+1];
+ visit[s] = -1;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ for (int[] next : adj[cur[0]]) {
+ if (visit[next[0]] == 0) {
+ visit[next[0]] = Math.min(cur[1], next[1]);
+ queue.add(new int[] {next[0], Math.min(cur[1], next[1])});
+ }
+ }
+ }
+
+ return 0;
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_17352.java b/java/BOJ/Gold/V/G5_17352.java
new file mode 100644
index 0000000..7bf04fb
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_17352.java
@@ -0,0 +1,93 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17352
+ *
+ * ? ์ ๋ชฉ: ์ฌ๋ฌ๋ถ์ ๋ค๋ฆฌ๊ฐ ๋์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค!
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ ๋ฆฐ์๋์๋ N๊ฐ์ ์ฌ์ด ์๋ค. ์ฌ์๋ 1, 2, ..., N์ ๋ฒํธ๊ฐ ํ๋์ฉ ๋ถ์ด ์๋ค. ๊ทธ ์ฌ๋ค์ N - 1๊ฐ์ ๋ค๋ฆฌ๊ฐ ์๊ณ ์์ผ๋ฉฐ, ์ด๋ค ๋ ์ฌ ์ฌ์ด๋ ๋ค๋ฆฌ๋ก ์๋ณตํ ์ ์๋ค.
+ * ์ด์ ๊น์ง๋ ๊ทธ๋ฌ๋ค.
+ * "์ ๋ค๋ฆฌ๊ฐ N - 1๊ฐ๋ฐ์ ์๋, ํตํํ๊ธฐ ๋ถํธํ๋ค"๋ฉฐ ์ ๋ฆฐ์๋์ ๋ถ๋ง์ ๊ฐ๋ ์ฑ์ ๊ฐ ๋ค๋ฆฌ ํ๋๋ฅผ ๋ฌด๋๋จ๋ ธ๋ค! ์ ๊ทธ๋๋ ๋ถํธํ ํตํ์ด ๋ ๋ถํธํด์ก๋ค. ์๋ก ์๋ณตํ ์ ์๋ ์ฌ๋ค์ด ์๊ฒผ๊ธฐ ๋๋ฌธ์ด๋ค. ์ผ๋จ ๊ธํ ๋๋ก ์ ๋ถ๋ ์ ๋ฆฐ์๋์ ๊ฑด์ถ๊ฐ๋ฅผ ๊ณ ์ฉํด, ์๋ก ๋ค๋ฅธ ๋ ์ฌ์ ๋ค๋ฆฌ๋ก ์ด์ด์ ๋ค์ ์ด๋ค ๋ ์ฌ ์ฌ์ด๋ ์๋ณตํ ์ ์๊ฒ ํ๋ผ๋ ์ง์๋ฅผ ๋ด๋ ธ๋ค.
+ * ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ฑด์ถ๊ฐ๊ฐ ๋น์ ์ด๋ค! ์ ๊ทธ๋๋ ์ฒํ์ ์ผ ์ฝ๋ฉ๋ํ์ ์ฐธ๊ฐํ๋๋ผ ๋ฐ์๋ฐ...
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ์ค์ ์ ์ N์ด ์ฃผ์ด์ง๋ค. (2 โค N โค 300,000)
+ * ๊ทธ ๋ค์ N - 2๊ฐ์ ์ค์๋ ์ฑ์ ๊ฐ ๋ฌด๋๋จ๋ฆฌ์ง ์์ ๋ค๋ฆฌ๋ค์ด ์๋ ๋ ์ฌ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 4 -> n
+ * 1 2 -> a b
+ * 1 3 -> a b
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ค๋ฆฌ๋ก ์ด์ ๋ ์ฌ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ ๊ฒฝ์ฐ ๊ทธ ์ค ์๋ฌด๊ฑฐ๋ ํ ๋ฐฉ๋ฒ๋ง ์ถ๋ ฅํ๋ค.
+ *
+ * 1 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * *์๊ฐ 0.596์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 90MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class G5_17352 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n;
+ static int[] parent;
+
+ public static void main(String[] args) throws IOException {
+ n = Integer.parseInt(br.readLine());
+ parent = IntStream.range(0, n+1).toArray();
+ StringBuffer sb = new StringBuffer();
+
+
+ for (int i = 0; i < n-2; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ union(a, b);
+ }
+
+ for (int i = 2; i <= n; i++) {
+ if (findParent(i) != 1) {
+ sb.append(1 + " " + i);
+ break;
+ }
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ public static void union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+
+ if (a < b) {
+ parent[b] = a;
+ } else {
+ parent[a] = b;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_17396.java b/java/BOJ/Gold/V/G5_17396.java
new file mode 100644
index 0000000..db88080
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_17396.java
@@ -0,0 +1,81 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17396
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.*;
+
+public class G5_17396 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+ static int[] sight;
+ static ArrayList[] list;
+
+ static int n, m;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ System.out.println(bfs());
+ }
+
+ public static long bfs() {
+ PriorityQueue queue = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1]));
+ long[] visit = new long[n];
+ Arrays.fill(visit, 10000000001L);
+ visit[0] = 0;
+ queue.add(new long[] {0, 0});
+
+ while (!queue.isEmpty()) {
+ long[] cur = queue.poll();
+
+ if (cur[0] == n-1) {
+ return cur[1];
+ }
+
+ if (visit[(int) cur[0]] < cur[1]) {
+ continue;
+ }
+
+ for (int[] next : list[(int) cur[0]]) {
+ if (visit[next[0]] > cur[1] + next[1]) {
+ visit[next[0]] = cur[1] + next[1];
+ queue.add(new long[] {next[0], cur[1] + next[1]});
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ sight = new int[n];
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ sight[i] = Integer.parseInt(st.nextToken());
+ }
+
+ list = new ArrayList[n];
+ for (int i = 0; i < n; i++) {
+ list[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int t = Integer.parseInt(st.nextToken());
+
+ if ((sight[a] == 0 && sight[b] == 0) || (a == n-1 && sight[b] == 0) || (b == n-1 && sight[a] == 0)) {
+ list[a].add(new int[] {b, t});
+ list[b].add(new int[] {a, t});
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_17836.java b/java/BOJ/Gold/V/G5_17836.java
new file mode 100644
index 0000000..c32dcb9
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_17836.java
@@ -0,0 +1,121 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17836
+ *
+ * ? ์ ๋ชฉ: ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ!
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ; 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ฉ์ฌ๋ ๋ง์์ด ์จ๊ฒจ๋์ ๊ณต์ฃผ๋์ ๊ตฌํ๊ธฐ ์ํด (N, M) ํฌ๊ธฐ์ ์ฑ ์
๊ตฌ (1,1)์ผ๋ก ๋ค์ด์๋ค. ๋ง์์ ์ฉ์ฌ๊ฐ ๊ณต์ฃผ๋ฅผ ์ฐพ์ง ๋ชปํ๋๋ก ์ฑ์ ์ฌ๋ฌ ๊ตฐ๋ฐ ๋ง๋ฒ ๋ฒฝ์ ์ธ์๋์๋ค. ์ฉ์ฌ๋ ํ์ฌ์ ๊ฐ์ง๊ณ ์๋ ๋ฌด๊ธฐ๋ก๋ ๋ง๋ฒ ๋ฒฝ์ ํต๊ณผํ ์ ์์ผ๋ฉฐ, ๋ง๋ฒ ๋ฒฝ์ ํผํด (N, M) ์์น์ ์๋ ๊ณต์ฃผ๋์ ๊ตฌ์ถํด์ผ๋ง ํ๋ค.
+ * ๋ง์์ ์ฉ์ฌ๋ฅผ ๊ดด๋กญํ๊ธฐ ์ํด ๊ณต์ฃผ์๊ฒ ์ ์ฃผ๋ฅผ ๊ฑธ์๋ค. ์ ์ฃผ์ ๊ฑธ๋ฆฐ ๊ณต์ฃผ๋ T์๊ฐ ์ด๋ด๋ก ์ฉ์ฌ๋ฅผ ๋ง๋์ง ๋ชปํ๋ค๋ฉด ์์ํ ๋๋ก ๋ณํ๊ฒ ๋๋ค. ๊ณต์ฃผ๋์ ๊ตฌ์ถํ๊ณ ํ๋ฌํฌ์ฆ ํ๊ณ ์ถ์ ์ฉ์ฌ๋ ๋ฐ๋์ T์๊ฐ ๋ด์ ๊ณต์ฃผ๋์ด ์๋ ๊ณณ์ ๋๋ฌํด์ผ ํ๋ค. ์ฉ์ฌ๋ ํ ์นธ์ ์ด๋ํ๋ ๋ฐ ํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ณต์ฃผ๋์ด ์๋ ๊ณณ์ ์ ํํ T์๊ฐ๋ง์ ๋๋ฌํ ๊ฒฝ์ฐ์๋ ๊ตฌ์ถํ ์ ์๋ค. ์ฉ์ฌ๋ ์ํ์ข์ฐ๋ก ์ด๋ํ ์ ์๋ค.
+ * ์ฑ์๋ ์ด์ ์ฉ์ฌ๊ฐ ์ฌ์ฉํ๋ ์ ์ค์ ๋ช
๊ฒ "๊ทธ๋"์ด ์จ๊ฒจ์ ธ ์๋ค. ์ฉ์ฌ๊ฐ ๊ทธ๋์ ๊ตฌํ๋ฉด ๋ง๋ฒ์ ๋ฒฝ์ด ์๋ ์นธ์ผ์ง๋ผ๋, ๋จ์จ์ ๋ฒฝ์ ๋ถ์๊ณ ๊ทธ ๊ณต๊ฐ์ผ๋ก ๊ฐ ์ ์๋ค. "๊ทธ๋"์ ์ฑ์ ์ด๋๊ฐ์ ๋ฐ๋์ ํ ๊ฐ ์กด์ฌํ๊ณ , ์ฉ์ฌ๋ ๊ทธ๋์ด ์๋ ๊ณณ์ ๋์ฐฉํ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋์ด ๋ถ์ ์ ์๋ ๋ฒฝ์ ๊ฐ์๋ ์ ํ์ด ์๋ค.
+ * ์ฐ๋ฆฌ ๋ชจ๋ ์ฉ์ฌ๊ฐ ๊ณต์ฃผ๋์ ์์ ํ๊ฒ ๊ตฌ์ถ ํ ์ ์๋์ง, ์๋ค๋ฉด ์ผ๋ง๋ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋์ง ์์๋ณด์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์๋ ์ฑ์ ํฌ๊ธฐ์ธ N, M ๊ทธ๋ฆฌ๊ณ ๊ณต์ฃผ์๊ฒ ๊ฑธ๋ฆฐ ์ ์ฃผ์ ์ ํ ์๊ฐ์ธ ์ ์ T๊ฐ ์ฃผ์ด์ง๋ค. ์ฒซ ์ค์ ์ธ ๊ฐ์ ์๋ ๋์ด์ฐ๊ธฐ๋ก ๊ตฌ๋ถ๋๋ค. (3 โค N, M โค 100, 1 โค T โค 10000)
+ * ๋ ๋ฒ์งธ ์ค๋ถํฐ N+1๋ฒ์งธ ์ค๊น์ง ์ฑ์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ M๊ฐ์ ์๊ฐ ๋์ด์ฐ๊ธฐ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. 0์ ๋น ๊ณต๊ฐ, 1์ ๋ง๋ฒ์ ๋ฒฝ, 2๋ ๊ทธ๋์ด ๋์ฌ์๋ ๊ณต๊ฐ์ ์๋ฏธํ๋ค. (1,1)๊ณผ (N,M)์ 0์ด๋ค.
+ *
+ * 6 6 16 -> n m t
+ * 0 0 0 0 1 1 -> arr[0][0] ~ arr[0][m-1]
+ * 0 0 0 0 0 2
+ * 1 1 1 0 1 0
+ * 0 0 0 0 0 0
+ * 0 1 1 1 1 1
+ * 0 0 0 0 0 0 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฉ์ฌ๊ฐ ์ ํ ์๊ฐ T์๊ฐ ์ด๋ด์ ๊ณต์ฃผ์๊ฒ ๋๋ฌํ ์ ์๋ค๋ฉด, ๊ณต์ฃผ์๊ฒ ๋๋ฌํ ์ ์๋ ์ต๋จ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
+ * ๋ง์ฝ ์ฉ์ฌ๊ฐ ๊ณต์ฃผ๋ฅผ T์๊ฐ ์ด๋ด์ ๊ตฌ์ถํ ์ ์๋ค๋ฉด, "Fail"์ ์ถ๋ ฅํ๋ค.
+ *
+ * 10
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.144์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class G5_17836 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n, m, t;
+ static int[][] arr;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int answer = bfs();
+
+ if (answer <= t && answer != -1) {
+ System.out.println(answer);
+ } else {
+ System.out.println("Fail");
+ }
+ }
+
+ private static int bfs() {
+ Queue queue = new LinkedList<>();
+ boolean[][][] visit = new boolean[n][m][2];
+ queue.add(new int[] {0, 0, 0, 0});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == n-1 && cur[1] == m-1) {
+ return cur[2];
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = cur[0] + dx[i];
+ int ny = cur[1] + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
+ continue;
+ }
+
+ if (arr[nx][ny] == 2) {
+ arr[nx][ny] = 0;
+ visit[nx][ny][0] = true;
+ queue.add(new int[] {nx, ny, cur[2]+1, 1});
+ } else if (arr[nx][ny] == 0 && !visit[nx][ny][cur[3]]) {
+ visit[nx][ny][cur[3]] = true;
+ queue.add(new int[] {nx, ny, cur[2]+1, cur[3]});
+ } else if (arr[nx][ny] == 1 && cur[3] == 1 && !visit[nx][ny][0]) {
+ visit[nx][ny][0] = true;
+ queue.add(new int[] {nx, ny, cur[2]+1, 1});
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ t = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][m];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2011.java b/java/BOJ/Gold/V/G5_2011.java
new file mode 100644
index 0000000..132ce2b
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2011.java
@@ -0,0 +1,103 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง
+ * ? https://www.acmicpc.net/problem/2011
+ *
+ * ? ์ ๋ชฉ: ์ํธ ์ฝ๋
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์๊ทผ์ด์ ์ ์์ด๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋จ๋งค๊ฐ์ ๋ํ๋ฅผ ๋ฃ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๋ํ๋ฅผ ์๋ก ์ํธํ ํ๊ธฐ๋ก ํ๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ํ๋ฅผ ํ๋ค.
+ *
+ * ์๊ทผ: ๊ทธ๋ฅ ๊ฐ๋จํ ์ํธํ ํ์. A๋ฅผ 1์ด๋ผ๊ณ ํ๊ณ , B๋ 2๋ก, ๊ทธ๋ฆฌ๊ณ Z๋ 26์ผ๋ก ํ๋๊ฑฐ์ผ.
+ * ์ ์: ๊ทธ๋ผ ์๋ผ. ๋ง์ฝ, "BEAN"์ ์ํธํํ๋ฉด 25114๊ฐ ๋์ค๋๋ฐ, ์ด๊ฑธ ๋ค์ ๊ธ์๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ด.
+ * ์๊ทผ: ๊ทธ๋ ๋ค. 25114๋ฅผ ๋ค์ ์์ด๋ก ๋ฐ๊พธ๋ฉด, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" ์ด 6๊ฐ์ง๊ฐ ๋์ค๋๋ฐ, BEAN์ด ๋ง๋ ๋จ์ด๋ผ๋๊ฑด ์ฝ๊ฒ ์์ ์์์?
+ * ์ ์: ์๊ฐ ์ ์ ํ์ง ์์๋ค ใ
ใ
๋ง์ฝ ๋ด๊ฐ 500์๋ฆฌ ๊ธ์๋ฅผ ์ํธํ ํ๋ค๊ณ ํด๋ด. ๊ทธ ๋๋ ๋์ฌ ์ ์๋ ํด์์ด ์ ๋ง ๋ง์๋ฐ, ๊ทธ๊ฑธ ์ธ์ ๋คํด๋ด?
+ * ์๊ทผ: ์ผ๋ง๋ ๋ง์๋ฐ?
+ * ์ ์: ๊ตฌํด๋ณด์!
+ * ์ด๋ค ์ํธ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ์ํธ์ ํด์์ด ๋ช ๊ฐ์ง๊ฐ ๋์ฌ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ 5000์๋ฆฌ ์ดํ์ ์ํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ํธ๋ ์ซ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ *
+ * 25114 -> str
+ *
+ * ? ์ถ๋ ฅ
+ * ๋์ฌ ์ ์๋ ํด์์ ๊ฐ์ง์๋ฅผ ๊ตฌํ์์ค. ์ ๋ต์ด ๋งค์ฐ ํด ์ ์์ผ๋ฏ๋ก, 1000000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ์ํธ๊ฐ ์๋ชป๋์ด ์ํธ๋ฅผ ํด์ํ ์ ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
+ *
+ * 6
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class G5_2011 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ // * ํ์ฑ(์
๋ ฅ๋ฐ๊ธฐ)
+ String str = br.readLine();
+
+ // * ์ด๊ธฐ ์ค์
+ int len = str.length();
+ int div = 1000000;
+ boolean isError = false;
+
+ // * DP ํ
์ด๋ธ ์ด๊ธฐํ
+ int[] arr = new int[len+1];
+ int[] dp = new int[len+1];
+
+ // * ์์ธ ์ฒ๋ฆฌ
+ if (str.length() == 0) {
+ isError = true;
+ }
+ else if (str.charAt(0) == '0') {
+ isError = true;
+ }
+
+ // * DP (Tabulation: Bottom-Up)
+ else {
+ for (int i = 1; i <= len; i++) {
+ arr[i] = str.charAt(i-1) - '0';
+ }
+
+ // * Start Case
+ dp[0] = 1;
+ dp[1] = 1;
+
+ for (int i = 2; i <= len; i++) {
+ int num = arr[i-1] * 10 + arr[i];
+ if (arr[i] == 0) { // 0์ธ ๊ณณ์ ์์๋ฆฌ์ ๊ฐ์ด ์ํธ๊ฐ ๋์ด์ผ๋ง ํจ
+ if (!isOk(num)) { // ์์๋ฆฌ์ ํฉ์น ๊ฐ์ด invalid ํ ๋
+ isError = true;
+ break;
+ } else {
+ dp[i] = dp[i-2];
+ }
+ } else {
+ if (isOk(num) && arr[i-1] != 0) { // ์์๋ฆฌ์ ํฉ์น ๊ฐ์ด ์ ์์ ์ผ ๋
+ dp[i] = (dp[i-1] % div + dp[i-2] % div) % div;
+ } else { // ์์๋ฆฌ์ ํฉ์น ์ ์์ ๋
+ dp[i] = dp[i-1];
+ }
+ }
+ }
+ }
+
+ // * ์ถ๋ ฅ
+ System.out.println(isError ? 0 : dp[len]);
+ }
+
+ public static boolean isOk(int num) {
+ return num >= 1 && num <= 26;
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2096.java b/java/BOJ/Gold/V/G5_2096.java
new file mode 100644
index 0000000..aa2f10f
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2096.java
@@ -0,0 +1,96 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2096
+ *
+ * ? ์ ๋ชฉ: ๋ด๋ ค๊ฐ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 4MB
+ *
+ * ? ๋ฌธ์
+ * N์ค์ 0 ์ด์ 9 ์ดํ์ ์ซ์๊ฐ ์ธ ๊ฐ์ฉ ์ ํ ์๋ค. ๋ด๋ ค๊ฐ๊ธฐ ๊ฒ์์ ํ๊ณ ์๋๋ฐ, ์ด ๊ฒ์์ ์ฒซ ์ค์์ ์์ํด์ ๋ง์ง๋ง ์ค์์ ๋๋๊ฒ ๋๋ ๋์ด์ด๋ค.
+ * ๋จผ์ ์ฒ์์ ์ ํ ์๋ ์ธ ๊ฐ์ ์ซ์ ์ค์์ ํ๋๋ฅผ ๊ณจ๋ผ์ ์์ํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ค๋ก ๋ด๋ ค๊ฐ๋๋ฐ, ๋ค์ ์ค๋ก ๋ด๋ ค๊ฐ ๋์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ฝ ์กฐ๊ฑด์ด ์๋ค. ๋ฐ๋ก ์๋์ ์๋ก ๋์ด๊ฐ๊ฑฐ๋, ์๋๋ฉด ๋ฐ๋ก ์๋์ ์์ ๋ถ์ด ์๋ ์๋ก๋ง ์ด๋ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด ์ ์ฝ ์กฐ๊ฑด์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด์ด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+ * ๋ณํ๋ ํ์ฌ ์์น์ด๊ณ , ๊ทธ ์๋ซ ์ค์ ํ๋ ๋๊ทธ๋ผ๋ฏธ๋ ์๋ฃก์ด๊ฐ ๋ค์ ์ค๋ก ๋ด๋ ค๊ฐ ์ ์๋ ์์น์ด๋ฉฐ, ๋นจ๊ฐ ๊ฐ์ํ๋ ์๋ฃก์ด๊ฐ ๋ด๋ ค๊ฐ ์ ์๋ ์์น๊ฐ ๋๋ค. ์ซ์ํ๊ฐ ์ฃผ์ด์ ธ ์์ ๋, ์ป์ ์ ์๋ ์ต๋ ์ ์, ์ต์ ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ ์๋ ์๋ฃก์ด๊ฐ ์์นํ ๊ณณ์ ์์ ํฉ์ด๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ์ซ์๊ฐ ์ธ ๊ฐ์ฉ ์ฃผ์ด์ง๋ค. ์ซ์๋ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ์ค์ ํ๋๊ฐ ๋๋ค.
+ *
+ * 3 -> n
+ * 1 2 3 -> arr[0][0] ~ arr[0][2]
+ * 4 5 6
+ * 4 9 0 -> arr[n-1][0] ~ arr[n-1][2]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ป์ ์ ์๋ ์ต๋ ์ ์์ ์ต์ ์ ์๋ฅผ ๋์ด์ ์ถ๋ ฅํ๋ค.
+ *
+ * 18 6
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.54์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 57MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G5_2096 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] maxDp;
+ static int[][] minDp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i < n; i++) {
+ // * ๋ด๋ ค๊ฐ๊ธฐ ์ต๋๊ฐ DP
+ maxDp[i][0] = Math.max(maxDp[i-1][0], maxDp[i-1][1]) + arr[i][0];
+ maxDp[i][1] = Math.max(maxDp[i-1][0], Math.max(maxDp[i-1][1], maxDp[i-1][2])) + arr[i][1];
+ maxDp[i][2] = Math.max(maxDp[i-1][1], maxDp[i-1][2]) + arr[i][2];
+
+ // * ๋ด๋ ค๊ฐ๊ธฐ ์ต์๊ฐ DP
+ minDp[i][0] = Math.min(minDp[i-1][0], minDp[i-1][1]) + arr[i][0];
+ minDp[i][1] = Math.min(minDp[i-1][0], Math.min(minDp[i-1][1], minDp[i-1][2])) + arr[i][1];
+ minDp[i][2] = Math.min(minDp[i-1][1], minDp[i-1][2]) + arr[i][2];
+ }
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ int max = Arrays.stream(maxDp[n-1]).max().getAsInt();
+ int min = Arrays.stream(minDp[n-1]).min().getAsInt();
+
+ bw.write(max + " " + min);
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n][3];
+ maxDp = new int[n][3];
+ minDp = new int[n][3];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < 3; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ maxDp[i][j] = arr[i][j];
+ minDp[i][j] = arr[i][j];
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2166.java b/java/BOJ/Gold/V/G5_2166.java
new file mode 100644
index 0000000..519817f
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2166.java
@@ -0,0 +1,94 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2166
+ *
+ * ? ์ ๋ชฉ: ๋ค๊ฐํ์ ๋ฉด์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * 2์ฐจ์ ํ๋ฉด์์ N(3 โค N โค 10,000)๊ฐ์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ค๊ฐํ์ด ์๋ค. ์ด ๋ค๊ฐํ์ ๋ฉด์ ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๋ค๊ฐํ์ ์ด๋ฃจ๋ ์์๋๋ก N๊ฐ์ ์ ์ x, y์ขํ๊ฐ ์ฃผ์ด์ง๋ค. ์ขํ๊ฐ์ ์ ๋๊ฐ์ด 100,000์ ๋์ง ์๋ ์ ์์ด๋ค.
+ *
+ * 4 -> n
+ * 0 0 -> points.get(0)
+ * 0 10
+ * 10 10
+ * 10 0 -> points.get(n-1)
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฉด์ ์ ์ถ๋ ฅํ๋ค. ๋ฉด์ ์ ์ถ๋ ฅํ ๋์๋ ์์์ ์๋ ๋์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ์ฌ ์ฒซ์งธ ์๋ฆฌ๊น์ง ์ถ๋ ฅํ๋ค.
+ *
+ * 100.0
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.152์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 17MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+class Point {
+ long x;
+ long y;
+
+ public Point(long x, long y) {
+ this.x = x;
+ this.y = y;
+ }
+}
+
+public class G5_2166 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static ArrayList points = new ArrayList<>();
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ์ ๋ฐ๋ ์ ๋ฆฌ
+ long val1 = 0;
+ long val2 = 0;
+ for (int i = 0; i < n; i++) {
+ val1 += (points.get(i).x * points.get(i+1).y);
+ val2 += (points.get(i+1).x * points.get(i).y);
+ }
+
+ // * 3. ์ถ๋ ฅ: ์ถ๋ ฅ๊ฐ ํ๋ณํ
+ double area = Math.abs(val1 - val2) * 10.0 / 20;
+ String str = String.valueOf((long) (area * 10));
+ String answer = str.substring(0, str.length()-1) + "." + str.substring(str.length()-1);
+ bw.write(answer);
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ long x = Integer.parseInt(st.nextToken());
+ long y = Integer.parseInt(st.nextToken());
+
+ points.add(new Point(x, y));
+ }
+
+ points.add(points.get(0));
+ }
+
+}
diff --git a/java/BOJ/Gold/V/G5_2225.java b/java/BOJ/Gold/V/G5_2225.java
new file mode 100644
index 0000000..6e0d3f8
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2225.java
@@ -0,0 +1,76 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2225
+ *
+ * ? ์ ๋ชฉ: ํฉ๋ถํด
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * 0๋ถํฐ N๊น์ง์ ์ ์ K๊ฐ๋ฅผ ๋ํด์ ๊ทธ ํฉ์ด N์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ๋ง์
์ ์์๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ก ์ผ๋ค(1+2์ 2+1์ ์๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ). ๋ํ ํ ๊ฐ์ ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ธ ์๋ ์๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ ์ ์ N(1 โค N โค 200), K(1 โค K โค 200)๊ฐ ์ฃผ์ด์ง๋ค.
+ *
+ * 20 2 -> n k
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ต์ 1,000,000,000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 21
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.156์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G5_2225 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, k;
+
+ // * ์ด๊ธฐ ์ค์
+ static int div = 1_000_000_000;
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. Start Case ์ค์
+ for (int i = 0; i <= n; i++) {
+ dp[0][i] = 1;
+ }
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i < k; i++) {
+ for (int j = 0; j <= n; j++) {
+ for (int w = 0; w <= j; w++) {
+ dp[i][j] = (dp[i][j] % div + dp[i-1][w] % div) % div;
+ }
+ }
+ }
+
+ // * 4. ์ถ๋ ฅ
+ System.out.println(dp[k-1][n]);
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ dp = new int[k][n+1]; // DP ํ
์ด๋ธ ์ด๊ธฐํ
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2240.java b/java/BOJ/Gold/V/G5_2240.java
new file mode 100644
index 0000000..5763129
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2240.java
@@ -0,0 +1,100 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2240
+ *
+ * ? ์ ๋ชฉ: ์๋๋๋ฌด
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์๋๋ ์๋๋ฅผ ์ข์ํ๋ค. ๊ทธ๋์ ์ง์ ์๋๋๋ฌด๋ฅผ ์ฌ์ด๋๊ณ , ์ฌ๊ธฐ์ ์ด๋ฆฌ๋ ์๋๋ฅผ ๋จน๊ณ ๋ ํ๋ค. ํ์ง๋ง ์๋๋ ํค๊ฐ ์์์ ์๋๋ฅผ ๋ฐ๋จน์ง๋ ๋ชปํ๊ณ , ์๋๊ฐ ๋จ์ด์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค์์ ๋จ์ด์ง๋ ์๋๋ฅผ ๋ฐ์์ ๋จน๊ณ ๋ ํ๋ค. ์๋๋ฅผ ์ก์ ๋์๋ ์๋๊ฐ ํ๊ณต์ ์์ ๋ ์ก์์ผ ํ๋๋ฐ, ์ด๋ ์๋๊ฐ ๋ง๋๋ง๋ํ์ฌ ๋ฐ๋ฅ์ ๋จ์ด์ง๋ฉด ๋ชป ๋จน์ ์ ๋๋ก ๋ญ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
+ * ๋งค ์ด๋ง๋ค, ๋ ๊ฐ์ ๋๋ฌด ์ค ํ๋์ ๋๋ฌด์์ ์ด๋งค๊ฐ ๋จ์ด์ง๊ฒ ๋๋ค. ๋ง์ฝ ์ด๋งค๊ฐ ๋จ์ด์ง๋ ์๊ฐ, ์๋๊ฐ ๊ทธ ๋๋ฌด์ ์๋์ ์ ์์ผ๋ฉด ์๋๋ ๊ทธ ์ด๋งค๋ฅผ ๋ฐ์๋จน์ ์ ์๋ค. ๋ ๊ฐ์ ๋๋ฌด๋ ๊ทธ๋ค์ง ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์, ์๋๋ ํ๋์ ๋๋ฌด ์๋์ ์ ์๋ค๊ฐ ๋ค๋ฅธ ๋๋ฌด ์๋๋ก ๋น ๋ฅด๊ฒ(1์ด๋ณด๋ค ํจ์ฌ ์งง์ ์๊ฐ์) ์์ง์ผ ์ ์๋ค. ํ์ง๋ง ์๋๋ ์ฒด๋ ฅ์ด ๊ทธ๋ค์ง ์ข์ง ๋ชปํด์ ๋ง์ด ์์ง์ผ ์๋ ์๋ค.
+ * ์๋๋ T(1โคTโค1,000)์ด ๋์ ๋จ์ด์ง๊ฒ ๋๋ค. ์๋๋ ์ต๋ W(1โคWโค30)๋ฒ๋ง ์์ง์ด๊ณ ์ถ์ด ํ๋ค. ๋งค ์ด๋ง๋ค ์ด๋ ๋๋ฌด์์ ์๋๊ฐ ๋จ์ด์ง์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์๋๊ฐ ๋ฐ์ ์ ์๋ ์๋์ ๊ฐ์๋ฅผ ๊ตฌํด๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋๋ 1๋ฒ ์๋๋๋ฌด ์๋์ ์์นํด ์๋ค๊ณ ํ๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ ์ ์ T, W๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ T๊ฐ์ ์ค์๋ ๊ฐ ์๊ฐ์ ์๋๊ฐ ๋จ์ด์ง๋ ๋๋ฌด์ ๋ฒํธ๊ฐ 1 ๋๋ 2๋ก ์ฃผ์ด์ง๋ค.
+ *
+ * 7 2 -> t w
+ * 2 -> a
+ * 1 -> a
+ * 1 -> a
+ * 2 -> a
+ * 2 -> a
+ * 1 -> a
+ * 1 -> a
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์๋๊ฐ ๋ฐ์ ์ ์๋ ์๋์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 6
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.08์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G5_2240 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int t, w;
+ static int[] arr;
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ for (int i = 1; i <= t; i++) {
+ dp[0][i] = dp[0][i - 1];
+
+ if (arr[i] == 1) {
+ dp[0][i]++;
+ }
+ }
+
+ for (int i = 1; i <= w; i++) {
+ for (int j = 1; j <= t; j++) {
+ if (i % 2 == 0) { // 1๋ฒ ๋๋ฌด
+ dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j - 1]);
+
+ if (arr[j] == 1) {
+ dp[i][j]++;
+ }
+ } else { // 2๋ฒ ๋๋ฌด
+ dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j - 1]);
+ if (arr[j] == 2) {
+ dp[i][j]++;
+ }
+ }
+ }
+ }
+
+ int max = 0;
+ for (int i = 0; i <= w; i++) {
+ max = Math.max(max, dp[i][t]);
+ }
+
+ System.out.println(max);
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ t = Integer.parseInt(st.nextToken());
+ w = Integer.parseInt(st.nextToken());
+
+ arr = new int[t + 1];
+ dp = new int[w + 1][t + 1];
+
+ for (int i = 1; i <= t; i++) {
+ int a = Integer.parseInt(br.readLine());
+ arr[i] = a;
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2293.java b/java/BOJ/Gold/V/G5_2293.java
new file mode 100644
index 0000000..84065ac
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2293.java
@@ -0,0 +1,94 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2293
+ *
+ * ? ์ ๋ชฉ: ๋์ 1
+ * ? ์๊ฐ ์ ํ: 0.5์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 4MB
+ *
+ * ? ๋ฌธ์
+ * n๊ฐ์ง ์ข
๋ฅ์ ๋์ ์ด ์๋ค. ๊ฐ๊ฐ์ ๋์ ์ด ๋ํ๋ด๋ ๊ฐ์น๋ ๋ค๋ฅด๋ค. ์ด ๋์ ์ ์ ๋นํ ์ฌ์ฉํด์, ๊ทธ ๊ฐ์น์ ํฉ์ด k์์ด ๋๋๋ก ํ๊ณ ์ถ๋ค. ๊ทธ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ์์ค. ๊ฐ๊ฐ์ ๋์ ์ ๋ช ๊ฐ๋ผ๋ ์ฌ์ฉํ ์ ์๋ค.
+ * ์ฌ์ฉํ ๋์ ์ ๊ตฌ์ฑ์ด ๊ฐ์๋ฐ, ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ n, k๊ฐ ์ฃผ์ด์ง๋ค. (1 โค n โค 100, 1 โค k โค 10,000) ๋ค์ n๊ฐ์ ์ค์๋ ๊ฐ๊ฐ์ ๋์ ์ ๊ฐ์น๊ฐ ์ฃผ์ด์ง๋ค. ๋์ ์ ๊ฐ์น๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 3 10 -> n k
+ * 1 -> coins[0]
+ * 2 ...
+ * 5 -> coins[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฒฝ์ฐ์ ์๋ 2^31๋ณด๋ค ์๋ค.
+ *
+ * 10
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 96ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G5_2293 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, k;
+ static int[] coins;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. Start Case ์ค์
+ for (int i = 1; i <= k; i++) {
+ dp[0][i] = (i % coins[0] == 0) ? 1 : 0;
+ }
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i < n; i++) {
+ for (int j = 1; j <= k; j++) {
+ if (j >= coins[i]) {
+ if (j == coins[i]) {
+ dp[i][j] = dp[i-1][j] + 1;
+ } else {
+ dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]];
+ }
+ } else {
+ dp[i][j] = dp[i-1][j];
+ }
+ }
+ }
+
+ // * 4. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(dp[n-1][k]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ coins = new int[n];
+ dp = new int[n][k+1];
+
+ for (int i = 0; i < n; i++) {
+ coins[i] = Integer.parseInt(br.readLine());
+ }
+
+ Arrays.sort(coins);
+ }
+
+}
diff --git a/java/BOJ/Gold/V/G5_2294.java b/java/BOJ/Gold/V/G5_2294.java
new file mode 100644
index 0000000..cf9b915
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2294.java
@@ -0,0 +1,99 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2294
+ *
+ * ? ์ ๋ชฉ: ๋์ 2
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * n๊ฐ์ง ์ข
๋ฅ์ ๋์ ์ด ์๋ค. ์ด ๋์ ๋ค์ ์ ๋นํ ์ฌ์ฉํด์, ๊ทธ ๊ฐ์น์ ํฉ์ด k์์ด ๋๋๋ก ํ๊ณ ์ถ๋ค. ๊ทธ๋ฌ๋ฉด์ ๋์ ์ ๊ฐ์๊ฐ ์ต์๊ฐ ๋๋๋ก ํ๋ ค๊ณ ํ๋ค. ๊ฐ๊ฐ์ ๋์ ์ ๋ช ๊ฐ๋ผ๋ ์ฌ์ฉํ ์ ์๋ค.
+ * ์ฌ์ฉํ ๋์ ์ ๊ตฌ์ฑ์ด ๊ฐ์๋ฐ, ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ n, k๊ฐ ์ฃผ์ด์ง๋ค. (1 โค n โค 100, 1 โค k โค 10,000) ๋ค์ n๊ฐ์ ์ค์๋ ๊ฐ๊ฐ์ ๋์ ์ ๊ฐ์น๊ฐ ์ฃผ์ด์ง๋ค. ๋์ ์ ๊ฐ์น๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๊ฐ์น๊ฐ ๊ฐ์ ๋์ ์ด ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง ์๋ ์๋ค.
+ *
+ * 3 15 -> n k
+ * 1 -> HashSet ์ฝ์
+ * 5
+ * 12
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ฌ์ฉํ ๋์ ์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.1์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 16MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.StringTokenizer;
+
+public class G5_2294 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, k;
+ static HashSet coins;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ int p = 0;
+ for (int coin : coins) {
+ // * ๊ฐ์ฅ ๋จ์๊ฐ ์์ ๋์ ์ผ ๋
+ if (p == 0) {
+ for (int j = 1; j * coin <= k; j++) {
+ dp[p][j * coin] = j;
+ }
+ p++;
+ continue;
+ }
+
+ for (int j = 0; j <= k; j++) {
+ if (j < coin) {
+ dp[p][j] = dp[p-1][j];
+ } else {
+ dp[p][j] = Math.min(dp[p-1][j], dp[p][j-coin] + 1);
+ }
+ }
+ p++;
+ }
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ(๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ฐ์ด 100000์ด๋ฏ๋ก ๊ทธ๋๋ -1)
+ System.out.println(dp[dp.length-1][k] == 100000 ? -1 : dp[dp.length-1][k]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ coins = new HashSet<>();
+ for (int i = 0; i < n; i++) {
+ coins.add(Integer.parseInt(br.readLine()));
+ }
+
+ dp = new int[coins.size()][k+1];
+
+ for (int i = 0; i < dp.length; i++) {
+ for (int j = 1; j <= k; j++) {
+ dp[i][j] = 100000; // ์ถฉ๋ถํ ํฐ ์๋ก DP ํ
์ด๋ธ ์ด๊ธฐํ
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2447.java b/java/BOJ/Gold/V/G5_2447.java
new file mode 100644
index 0000000..b0eaee8
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2447.java
@@ -0,0 +1,123 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2447
+ *
+ * ? ์ ๋ชฉ: ๋ณ ์ฐ๊ธฐ - 10
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ฌ๊ท์ ์ธ ํจํด์ผ๋ก ๋ณ์ ์ฐ์ด ๋ณด์. N์ด 3์ ๊ฑฐ๋ญ์ ๊ณฑ(3, 9, 27, ...)์ด๋ผ๊ณ ํ ๋, ํฌ๊ธฐ N์ ํจํด์ NรN ์ ์ฌ๊ฐํ ๋ชจ์์ด๋ค.
+ * ํฌ๊ธฐ 3์ ํจํด์ ๊ฐ์ด๋ฐ์ ๊ณต๋ฐฑ์ด ์๊ณ , ๊ฐ์ด๋ฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ์นธ์ ๋ณ์ด ํ๋์ฉ ์๋ ํจํด์ด๋ค.
+ *
+ * ***
+ * * *
+ * ***
+ *
+ * N์ด 3๋ณด๋ค ํด ๊ฒฝ์ฐ, ํฌ๊ธฐ N์ ํจํด์ ๊ณต๋ฐฑ์ผ๋ก ์ฑ์์ง ๊ฐ์ด๋ฐ์ (N/3)ร(N/3) ์ ์ฌ๊ฐํ์ ํฌ๊ธฐ N/3์ ํจํด์ผ๋ก ๋๋ฌ์ผ ํํ์ด๋ค. ์๋ฅผ ๋ค์ด ํฌ๊ธฐ 27์ ํจํด์ ์์ ์ถ๋ ฅ 1๊ณผ ๊ฐ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. N์ 3์ ๊ฑฐ๋ญ์ ๊ณฑ์ด๋ค. ์ฆ ์ด๋ค ์ ์ k์ ๋ํด N=3k์ด๋ฉฐ, ์ด๋ 1 โค k < 8์ด๋ค.
+ *
+ * 27
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค๋ถํฐ N๋ฒ์งธ ์ค๊น์ง ๋ณ์ ์ถ๋ ฅํ๋ค.
+ *
+ * ***************************
+ * * ** ** ** ** ** ** ** ** *
+ * ***************************
+ * *** ****** ****** ***
+ * * * * ** * * ** * * *
+ * *** ****** ****** ***
+ * ***************************
+ * * ** ** ** ** ** ** ** ** *
+ * ***************************
+ * ********* *********
+ * * ** ** * * ** ** *
+ * ********* *********
+ * *** *** *** ***
+ * * * * * * * * *
+ * *** *** *** ***
+ * ********* *********
+ * * ** ** * * ** ** *
+ * ********* *********
+ * ***************************
+ * * ** ** ** ** ** ** ** ** *
+ * ***************************
+ * *** ****** ****** ***
+ * * * * ** * * ** * * *
+ * *** ****** ****** ***
+ * ***************************
+ * * ** ** ** ** ** ** ** ** *
+ * ***************************
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 196ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 22MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Gold.V;
+
+import java.io.*;
+
+public class G5_2447 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ
+ static int n;
+
+ // * ์ด๊ธฐ ์ค์
+ static char[][] arr;
+
+ public static void main(String[] args) throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new char[n][n];
+
+ find(0, 0, n, false);
+
+ for (int i = 0; i < n; i++) {
+ bw.write(arr[i]);
+ bw.write("\n");
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void find(int x, int y, int n, boolean isBlank) {
+ // ๋น๊ณต๊ฐ์ผ ๋
+ if (isBlank) {
+ for (int i = x; i < x + n; i++) {
+ for (int j = y; j < y + n; j++) {
+ arr[i][j] = ' ';
+ }
+ }
+ return;
+ }
+
+ // ๋์ด์ ์ชผ๊ฐค ์ ์์ ๋
+ if (n == 1) {
+ arr[x][y] = '*';
+ return;
+ }
+
+
+ // 9๋ธ๋ญ์ผ๋ก ๋๋์์ ๋ ํ๋ณ์ ๊ธธ์ด
+ int side = n / 3;
+ int cnt = 0;
+ for (int i = x; i < x + n; i += side) {
+ for (int j = y; j < y + n; j += side) {
+ cnt++;
+ if (cnt == 5) {
+ find(i, j, side, true);
+ } else {
+ find(i, j, side, false);
+ }
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2467.java b/java/BOJ/Gold/V/G5_2467.java
new file mode 100644
index 0000000..df47752
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2467.java
@@ -0,0 +1,103 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2467
+ *
+ * ? ์ ๋ชฉ: ์ฉ์ก
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * KOI ๋ถ์ค ๊ณผํ์ฐ๊ตฌ์์์๋ ๋ง์ ์ข
๋ฅ์ ์ฐ์ฑ ์ฉ์ก๊ณผ ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ๋ณด์ ํ๊ณ ์๋ค. ๊ฐ ์ฉ์ก์๋ ๊ทธ ์ฉ์ก์ ํน์ฑ์ ๋ํ๋ด๋ ํ๋์ ์ ์๊ฐ ์ฃผ์ด์ ธ์๋ค. ์ฐ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ 1๋ถํฐ 1,000,000,000๊น์ง์ ์์ ์ ์๋ก ๋ํ๋ด๊ณ , ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ -1๋ถํฐ -1,000,000,000๊น์ง์ ์์ ์ ์๋ก ๋ํ๋ธ๋ค.
+ * ๊ฐ์ ์์ ๋ ์ฉ์ก์ ํผํฉํ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํผํฉ์ ์ฌ์ฉ๋ ๊ฐ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ผ๋ก ์ ์ํ๋ค. ์ด ์ฐ๊ตฌ์์์๋ ๊ฐ์ ์์ ๋ ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ด [-99, -2, -1, 4, 98]์ธ ๊ฒฝ์ฐ์๋ ํน์ฑ๊ฐ์ด -99์ธ ์ฉ์ก๊ณผ ํน์ฑ๊ฐ์ด 98์ธ ์ฉ์ก์ ํผํฉํ๋ฉด ํน์ฑ๊ฐ์ด -1์ธ ์ฉ์ก์ ๋ง๋ค ์ ์๊ณ , ์ด ์ฉ์ก์ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ด๋ค. ์ฐธ๊ณ ๋ก, ๋ ์ข
๋ฅ์ ์์นผ๋ฆฌ์ฑ ์ฉ์ก๋ง์ผ๋ก๋ ํน์ ๋ ์ข
๋ฅ์ ์ฐ์ฑ ์ฉ์ก๋ง์ผ๋ก ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ํผํฉ ์ฉ์ก์ ๋ง๋๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๋ค.
+ * ์ฐ์ฑ ์ฉ์ก๊ณผ ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ด ์ ๋ ฌ๋ ์์๋ก ์ฃผ์ด์ก์ ๋, ์ด ์ค ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๋ ์ฉ์ก์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฉ์ก์ ์ N์ด ์
๋ ฅ๋๋ค. N์ 2 ์ด์ 100,000 ์ดํ์ ์ ์์ด๋ค. ๋์งธ ์ค์๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ๋ํ๋ด๋ N๊ฐ์ ์ ์๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ค๋ฆ์ฐจ์์ผ๋ก ์
๋ ฅ๋๋ฉฐ, ์ด ์๋ค์ ๋ชจ๋ -1,000,000,000 ์ด์ 1,000,000,000 ์ดํ์ด๋ค. N๊ฐ์ ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ ๋ชจ๋ ์๋ก ๋ค๋ฅด๊ณ , ์ฐ์ฑ ์ฉ์ก๋ง์ผ๋ก๋ ์์นผ๋ฆฌ์ฑ ์ฉ์ก๋ง์ผ๋ก ์
๋ ฅ์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์์ ์ ์๋ค.
+ *
+ * 5 -> n
+ * -99 -2 -1 4 98 -> arr[0] ~ arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ถ๋ ฅํ๋ค. ์ถ๋ ฅํด์ผ ํ๋ ๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค. ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๊ฒฝ์ฐ๊ฐ ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ์๋ ๊ทธ ์ค ์๋ฌด๊ฒ์ด๋ ํ๋๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * -99 98
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.296์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 32MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G5_2467 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = Integer.MAX_VALUE;
+ static int[] result;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ์ด๋ถํ์
+ for (int i = 0; i < n; i++) {
+ int left = 0;
+ int right = n - 1;
+ int val = arr[i];
+
+ while (left <= right) {
+ int mid = (left + right) / 2;
+ int sum = val + arr[mid];
+
+ if (Math.abs(sum) <= max && mid != i) {
+ max = Math.abs(sum);
+ result[0] = arr[i];
+ result[1] = arr[mid];
+ }
+
+ if (sum > 0) {
+ right = mid - 1;
+ } else {
+ left = mid + 1;
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ if (result[0] > result[1]) {
+ bw.write(result[1] + " " + result[0]);
+ } else {
+ bw.write(result[0] + " " + result[1]);
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n];
+ result = new int[2];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+
+ Arrays.sort(arr);
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2470.java b/java/BOJ/Gold/V/G5_2470.java
new file mode 100644
index 0000000..45314e9
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2470.java
@@ -0,0 +1,101 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2470
+ *
+ * ? ์ ๋ชฉ: ๋ ์ฉ์ก
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * KOI ๋ถ์ค ๊ณผํ์ฐ๊ตฌ์์์๋ ๋ง์ ์ข
๋ฅ์ ์ฐ์ฑ ์ฉ์ก๊ณผ ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ๋ณด์ ํ๊ณ ์๋ค. ๊ฐ ์ฉ์ก์๋ ๊ทธ ์ฉ์ก์ ํน์ฑ์ ๋ํ๋ด๋ ํ๋์ ์ ์๊ฐ ์ฃผ์ด์ ธ์๋ค. ์ฐ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ 1๋ถํฐ 1,000,000,000๊น์ง์ ์์ ์ ์๋ก ๋ํ๋ด๊ณ , ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ -1๋ถํฐ -1,000,000,000๊น์ง์ ์์ ์ ์๋ก ๋ํ๋ธ๋ค.
+ * ๊ฐ์ ์์ ๋ ์ฉ์ก์ ํผํฉํ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํผํฉ์ ์ฌ์ฉ๋ ๊ฐ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ผ๋ก ์ ์ํ๋ค. ์ด ์ฐ๊ตฌ์์์๋ ๊ฐ์ ์์ ๋ ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ด [-2, 4, -99, -1, 98]์ธ ๊ฒฝ์ฐ์๋ ํน์ฑ๊ฐ์ด -99์ธ ์ฉ์ก๊ณผ ํน์ฑ๊ฐ์ด 98์ธ ์ฉ์ก์ ํผํฉํ๋ฉด ํน์ฑ๊ฐ์ด -1์ธ ์ฉ์ก์ ๋ง๋ค ์ ์๊ณ , ์ด ์ฉ์ก์ด ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ด๋ค. ์ฐธ๊ณ ๋ก, ๋ ์ข
๋ฅ์ ์์นผ๋ฆฌ์ฑ ์ฉ์ก๋ง์ผ๋ก๋ ํน์ ๋ ์ข
๋ฅ์ ์ฐ์ฑ ์ฉ์ก๋ง์ผ๋ก ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ํผํฉ ์ฉ์ก์ ๋ง๋๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๋ค.
+ * ์ฐ์ฑ ์ฉ์ก๊ณผ ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ํน์ฑ๊ฐ์ด ์ฃผ์ด์ก์ ๋, ์ด ์ค ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๋ ์ฉ์ก์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฉ์ก์ ์ N์ด ์
๋ ฅ๋๋ค. N์ 2 ์ด์ 100,000 ์ดํ์ด๋ค. ๋์งธ ์ค์๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ๋ํ๋ด๋ N๊ฐ์ ์ ์๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด ์๋ค์ ๋ชจ๋ -1,000,000,000 ์ด์ 1,000,000,000 ์ดํ์ด๋ค. N๊ฐ์ ์ฉ์ก๋ค์ ํน์ฑ๊ฐ์ ๋ชจ๋ ๋ค๋ฅด๊ณ , ์ฐ์ฑ ์ฉ์ก๋ง์ผ๋ก๋ ์์นผ๋ฆฌ์ฑ ์ฉ์ก๋ง์ผ๋ก ์
๋ ฅ์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์์ ์ ์๋ค.
+ *
+ * 5 -> n
+ * -2 4 -99 -1 98 -> arr[0] ~ arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ถ๋ ฅํ๋ค. ์ถ๋ ฅํด์ผ ํ๋ ๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค. ํน์ฑ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๊ฒฝ์ฐ๊ฐ ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ์๋ ๊ทธ ์ค ์๋ฌด๊ฒ์ด๋ ํ๋๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * -99 98
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.312์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 31MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G5_2470 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n;
+ static int[] arr;
+ static int max = Integer.MAX_VALUE;
+ static int[] result;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ์ด๋ถํ์
+ for (int i = 0; i < n; i++) {
+ int left = 0;
+ int right = n - 1;
+ int val = arr[i];
+
+ while (left <= right) {
+ int mid = (left + right) / 2;
+ int sum = val + arr[mid];
+
+ if (Math.abs(sum) <= max && mid != i) {
+ max = Math.abs(sum);
+ result[0] = arr[i];
+ result[1] = arr[mid];
+ }
+
+ if (sum > 0) {
+ right = mid - 1;
+ } else {
+ left = mid + 1;
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ if (result[0] > result[1]) {
+ bw.write(result[1] + " " + result[0]);
+ } else {
+ bw.write(result[0] + " " + result[1]);
+ }
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n];
+ result = new int[2];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+
+ // * ์ ๋ ฌ
+ Arrays.sort(arr);
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_2565.java b/java/BOJ/Gold/V/G5_2565.java
new file mode 100644
index 0000000..285f9a9
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_2565.java
@@ -0,0 +1,107 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2565
+ *
+ * ? ์ ๋ชฉ: ์ ๊น์ค
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ ์ ๋ด๋ A์ B ์ฌ์ด์ ํ๋ ๋์ฉ ์ ๊น์ค์ ์ถ๊ฐํ๋ค ๋ณด๋ ์ ๊น์ค์ด ์๋ก ๊ต์ฐจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์๋ค. ํฉ์ ์ ์ํ์ด ์์ด ์ด๋ค ์ค ๋ช ๊ฐ์ ์ ๊น์ค์ ์์ ์ ๊น์ค์ด ๊ต์ฐจํ์ง ์๋๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด, < ๊ทธ๋ฆผ 1 >๊ณผ ๊ฐ์ด ์ ๊น์ค์ด ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ A์ 1๋ฒ ์์น์ B์ 8๋ฒ ์์น๋ฅผ ์๋ ์ ๊น์ค, A์ 3๋ฒ ์์น์ B์ 9๋ฒ ์์น๋ฅผ ์๋ ์ ๊น์ค, A์ 4๋ฒ ์์น์ B์ 1๋ฒ ์์น๋ฅผ ์๋ ์ ๊น์ค์ ์์ ๋ฉด ๋จ์์๋ ๋ชจ๋ ์ ๊น์ค์ด ์๋ก ๊ต์ฐจํ์ง ์๊ฒ ๋๋ค.
+ * ์ ๊น์ค์ด ์ ๋ด๋์ ์ฐ๊ฒฐ๋๋ ์์น๋ ์ ๋ด๋ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๋ค. ์ ๊น์ค์ ๊ฐ์์ ์ ๊น์ค๋ค์ด ๋ ์ ๋ด๋์ ์ฐ๊ฒฐ๋๋ ์์น์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง ๋, ๋จ์์๋ ๋ชจ๋ ์ ๊น์ค์ด ์๋ก ๊ต์ฐจํ์ง ์๊ฒ ํ๊ธฐ ์ํด ์์ ์ผ ํ๋ ์ ๊น์ค์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ * ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ๋ ์ ๋ด๋ ์ฌ์ด์ ์ ๊น์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ์ ๊น์ค์ ๊ฐ์๋ 100 ์ดํ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ ํ ์ค์ ํ๋์ฉ ์ ๊น์ค์ด A์ ๋ด๋์ ์ฐ๊ฒฐ๋๋ ์์น์ ๋ฒํธ์ B์ ๋ด๋์ ์ฐ๊ฒฐ๋๋ ์์น์ ๋ฒํธ๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ์์น์ ๋ฒํธ๋ 500 ์ดํ์ ์์ฐ์์ด๊ณ , ๊ฐ์ ์์น์ ๋ ๊ฐ ์ด์์ ์ ๊น์ค์ด ์ฐ๊ฒฐ๋ ์ ์๋ค.
+ *
+ * 8 -> n
+ * 1 8 -> arr[0][0] arr[0][1]
+ * 3 9
+ * 2 2
+ * 4 1
+ * 6 4
+ * 10 10
+ * 9 7
+ * 7 6 -> arr[n-1][0] arr[n-1][1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋จ์์๋ ๋ชจ๋ ์ ๊น์ค์ด ์๋ก ๊ต์ฐจํ์ง ์๊ฒ ํ๊ธฐ ์ํด ์์ ์ผ ํ๋ ์ ๊น์ค์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.22์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 18MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class G5_2565 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ (B์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ)
+ int lis = LIS(); // * 2. LIS
+ System.out.println(n - lis); // * 3. ์ ๋ด๋ ๊ฐฏ์์์ LIS ๊ธธ์ด๋ฅผ ๋บ ๊ฐ ์ถ๋ ฅ
+ }
+
+ // * LIS
+ public static int LIS() {
+ int[] dp = new int[n];
+ dp[0] = arr[0][0];
+ int p = 1;
+
+ for (int i = 1; i < n; i++) {
+ if (dp[p-1] < arr[i][0]) {
+ dp[p++] = arr[i][0];
+ } else {
+ int left = 0;
+ int right = p-1;
+
+ while (left <= right) {
+ int mid = (left + right) / 2;
+
+ if (dp[mid] == arr[i][0]) {
+ break;
+ }
+
+ if (dp[mid] > arr[i][0]) {
+ right = mid-1;
+ } else {
+ left = mid+1;
+ }
+ }
+
+ dp[left] = arr[i][0];
+ }
+ }
+
+ return p;
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n][2];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ arr[i] = new int[] {a, b};
+ }
+
+ Arrays.sort(arr, (a, b) -> a[1] - b[1]);
+ }
+}
\ No newline at end of file
diff --git a/java/BOJ/Gold/V/G5_5557.java b/java/BOJ/Gold/V/G5_5557.java
new file mode 100644
index 0000000..8b80a2a
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_5557.java
@@ -0,0 +1,78 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/5557
+ *
+ * ? ์ ๋ชฉ: 1ํ๋
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์๊ทผ์ด๊ฐ 1ํ๋
๋, ๋ง์
, ๋บ์
์ ๋งค์ฐ ์ข์ํ๋ค. ์๊ทผ์ด๋ ์ซ์๊ฐ ์ค ์ง์ด์๋ ๊ฒ์ ๋ณด๊ธฐ๋ง ํ๋ฉด, ๋ง์ง๋ง ๋ ์ซ์ ์ฌ์ด์ '='์ ๋ฃ๊ณ , ๋๋จธ์ง ์ซ์ ์ฌ์ด์๋ '+' ๋๋ '-'๋ฅผ ๋ฃ์ด ๋ฑ์์ ๋ง๋ค๋ฉฐ ๋๊ณ ์๋ค. ์๋ฅผ ๋ค์ด, "8 3 2 4 8 7 2 4 0 8 8"์์ ๋ฑ์ "8+3-2-4+8-7-2-4-0+8=8"์ ๋ง๋ค ์ ์๋ค.
+ * ์๊ทผ์ด๋ ์ฌ๋ฐ๋ฅธ ๋ฑ์์ ๋ง๋ค๋ ค๊ณ ํ๋ค. ์๊ทผ์ด๋ ์์ง ํ๊ต์์ ์์๋ฅผ ๋ฐฐ์ฐ์ง ์์๊ณ , 20์ ๋๋ ์๋ ๋ชจ๋ฅธ๋ค. ๋ฐ๋ผ์, ์ผ์ชฝ๋ถํฐ ๊ณ์ฐํ ๋, ์ค๊ฐ์ ๋์ค๋ ์๊ฐ ๋ชจ๋ 0 ์ด์ 20 ์ดํ์ด์ด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, "8+3+2-4-8-7+2+4+0+8=8"์ ์ฌ๋ฐ๋ฅธ ๋ฑ์์ด์ง๋ง, 8+3+2-4-8-7์ด ์์์ด๊ธฐ ๋๋ฌธ์, ์๊ทผ์ด๊ฐ ๋ง๋ค ์ ์๋ ๋ฑ์์ด๋ค.
+ * ์ซ์๊ฐ ์ฃผ์ด์ก์ ๋, ์๊ทผ์ด๊ฐ ๋ง๋ค ์ ์๋ ์ฌ๋ฐ๋ฅธ ๋ฑ์์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ซ์์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (3 โค N โค 100) ๋์งธ ์ค์๋ 0 ์ด์ 9 ์ดํ์ ์ ์ N๊ฐ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ฃผ์ด์ง๋ค.
+ *
+ * 11 -> n
+ * 8 3 2 4 8 7 2 4 0 8 8 -> arr[0] ~ arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์๊ทผ์ด๊ฐ ๋ง๋ค ์ ์๋ ์ฌ๋ฐ๋ฅธ ๋ฑ์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด ๊ฐ์ 263-1 ์ดํ์ด๋ค.
+ *
+ * 10
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class G5_5557 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n;
+ static int[] arr;
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ long[][] dp = new long[n][21];
+ dp[0][arr[0]] = 1;
+
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j <= 20; j++) {
+ if (dp[i - 1][j] > 0) {
+ if (j + arr[i] <= 20) {
+ dp[i][j + arr[i]] += dp[i - 1][j];
+ }
+
+ if (j - arr[i] >= 0) {
+ dp[i][j - arr[i]] += dp[i - 1][j];
+ }
+ }
+ }
+ }
+
+ System.out.println(dp[n - 2][arr[n - 1]]);
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n];
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_5582.java b/java/BOJ/Gold/V/G5_5582.java
new file mode 100644
index 0000000..ae3afec
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_5582.java
@@ -0,0 +1,74 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/5582
+ *
+ * ? ์ ๋ชฉ: ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ ๋ฌธ์์ด์ ๋ชจ๋ ํฌํจ๋ ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์ด๋ค ๋ฌธ์์ด s์ ๋ถ๋ถ ๋ฌธ์์ด t๋, s์ t๊ฐ ์ฐ์์ผ๋ก ๋ํ๋๋ ๊ฒ์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด ABRACADABRA์ ๋ถ๋ถ ๋ฌธ์์ด์ ABRA, RAC, D, ACADABRA, ABRACADABRA, ๋น ๋ฌธ์์ด ๋ฑ์ด๋ค. ํ์ง๋ง, ABRC, RAA, BA, K๋ ๋ถ๋ถ ๋ฌธ์์ด์ด ์๋๋ค.
+ * ๋ ๋ฌธ์์ด ABRACADABRA์ ECADADABRBCRDARA์ ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ CA, CADA, ADABR, ๋น ๋ฌธ์์ด ๋ฑ์ด ์๋ค. ์ด ์ค์์ ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ADABR์ด๋ฉฐ, ๊ธธ์ด๋ 5์ด๋ค. ๋, ๋ ๋ฌธ์์ด์ด UPWJCIRUCAXIIRGL์ SBQNYBSBZDFNEV์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ๋น ๋ฌธ์์ด์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ๋๋ฌธ์๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ธธ์ด๋ 1 ์ด์ 4000 ์ดํ์ด๋ค.
+ *
+ * ABRACADABRA -> str1
+ * ECADADABRBCRDARA -> str2
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ ๋ฌธ์์ด์ ๋ชจ๋ ํฌํจ ๋ ๋ถ๋ถ ๋ฌธ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.184์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 74MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.Arrays;
+
+public class G5_5582 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ
+ static char[] str1, str2;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = 0;
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i <= str1.length; i++) {
+ for (int j = 1; j <= str2.length; j++) {
+ if (str1[i - 1] == str2[j - 1]) {
+ dp[i][j] = dp[i - 1][j - 1] + 1;
+ max = Math.max(max, dp[i][j]);
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(String.valueOf(max));
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ str1 = br.readLine().toCharArray();
+ str2 = br.readLine().toCharArray();
+ dp = new int[str1.length + 1][str2.length + 1];
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_5972.java b/java/BOJ/Gold/V/G5_5972.java
new file mode 100644
index 0000000..51579d1
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_5972.java
@@ -0,0 +1,123 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/5972
+ *
+ * ? ํ๋ฐฐ ๋ฐฐ์ก
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋๋ถ ํ์๋ ๋๋ถ ์ฐฌํ์ด์๊ฒ ํ๋ฐฐ๋ฅผ ๋ฐฐ๋ฌํด์ค์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ, ๊ฐ ์ค๋น๋ฅผ ํ๊ณ ์์ต๋๋ค. ํํ๋กญ๊ฒ ๊ฐ๋ ค๋ฉด ๊ฐ๋ ๊ธธ์ ๋ง๋๋ ๋ชจ๋ ์๋ค์๊ฒ ๋ง์๋ ์ฌ๋ฌผ์ ์ค์ผ ํฉ๋๋ค. ๋ฌผ๋ก ํ์๋ ๊ตฌ๋์ ๋ผ์ ์ต์ํ์ ์๋ค์ ๋ง๋๋ฉด์ ์ง๋๊ฐ๊ณ ์ถ์ต๋๋ค.
+ * ๋๋ถ ํ์์๊ฒ๋ ์ง๋๊ฐ ์์ต๋๋ค. N (1 <= N <= 50,000) ๊ฐ์ ํ๊ฐ๊ณผ, ์๋ค์ ๊ธธ์ธ M (1 <= M <= 50,000) ๊ฐ์ ์๋ฐฉํฅ ๊ธธ์ด ๊ทธ๋ ค์ ธ ์๊ณ , ๊ฐ๊ฐ์ ๊ธธ์ C_i (0 <= C_i <= 1,000) ๋ง๋ฆฌ์ ์๊ฐ ์์ต๋๋ค. ์๋ค์ ๊ธธ์ ๋ ๊ฐ์ ๋จ์ด์ง ํ๊ฐ์ธ A_i ์ B_i (1 <= A_i <= N; 1 <= B_i <= N; A_i != B_i)๋ฅผ ์์ต๋๋ค. ๋ ๊ฐ์ ํ๊ฐ์ ํ๋ ์ด์์ ๊ธธ๋ก ์ฐ๊ฒฐ๋์ด ์์ ์๋ ์์ต๋๋ค. ๋๋ถ ํ์๋ ํ๊ฐ 1์ ์๊ณ ๋๋ถ ์ฐฌํ์ด๋ ํ๊ฐ N์ ์์ต๋๋ค.
+ * ๋ค์ ์ง๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
+ *
+ * [2]---
+ * / | \
+ * /1 | \ 6
+ * / | \
+ * [1] 0| --[3]
+ * \ | / \2
+ * 4\ | /4 [6]
+ * \ | / /1
+ * [4]-----[5]
+ * 3
+ * ๋๋ถ ํ์๊ฐ ์ ํํ ์ ์๋ ์ต์ ์ ํต๋ก๋ 1 -> 2 -> 4 -> 5 -> 6 ์
๋๋ค. ์๋ํ๋ฉด ์ฌ๋ฌผ์ ์ดํฉ์ด 1 + 0 + 3 + 1 = 5 ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
+ * ๋๋ถ ํ์์ ์ง๋๊ฐ ์ฃผ์ด์ง๊ณ , ์ง๋๊ฐ๋ ๊ธธ์ ์๋ฅผ ๋ง๋๋ฉด ์ค์ผํ ์ฌ๋ฌผ์ ๋น์ฉ์ด ์ฃผ์ด์ง ๋ ์ต์ ์ฌ๋ฌผ์ ์ผ๋ง์ผ๊น์? ๋๋ถ ํ์๋ ๊ฐ๋ ๊ธธ์ ๊ธธ์ด๋ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N๊ณผ M์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
+ * ๋์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง ์ธ ๊ฐ์ ์ ์ A_i, B_i, C_i๊ฐ ์ฃผ์ด์ง๋๋ค.
+ *
+ * 6 8 -> n m
+ * 4 5 3 -> a b c
+ * 2 4 0 -> a b c
+ * 4 1 4 -> a b c
+ * 2 1 1 -> a b c
+ * 5 6 1 -> a b c
+ * 3 6 2 -> a b c
+ * 3 2 6 -> a b c
+ * 3 4 4 -> a b c
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋๋ถ ํ์๊ฐ ๊ฐ์ ธ๊ฐ์ผ ๋ ์ต์ ์ฌ๋ฌผ์ ์ถ๋ ฅํฉ๋๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.568์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 44MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.PriorityQueue;
+import java.util.StringTokenizer;
+
+public class G5_5972 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static ArrayList[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static final long max = 25_000_000_000L;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
+ long[] visited = new long[n+1];
+ Arrays.fill(visited, max);
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1]));
+ pq.add(new long[] {1, 0});
+ visited[1] = 0;
+
+ while (!pq.isEmpty()) {
+ long[] cur = pq.poll();
+
+ if (visited[(int) cur[0]] < cur[1]) {
+ continue;
+ }
+
+ for (long[] next : arr[(int) cur[0]]) {
+ if (visited[(int) next[0]] > next[1] + cur[1]) {
+ visited[(int) next[0]] = next[1] + cur[1];
+ pq.add(new long[] {next[0], visited[(int) next[0]]});
+ }
+ }
+ }
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(visited[n]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new ArrayList[n+1];
+
+ for (int i = 1; i <= n; i++) {
+ arr[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+ int c = Integer.parseInt(st.nextToken());
+
+ arr[a].add(new long[] {b, c});
+ arr[b].add(new long[] {a, c});
+ }
+
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_9084.java b/java/BOJ/Gold/V/G5_9084.java
new file mode 100644
index 0000000..a3f2083
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_9084.java
@@ -0,0 +1,107 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9084
+ *
+ * ? ์ ๋ชฉ: ๋์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ฐ๋ฆฌ๋๋ผ ํํ๋จ์, ํนํ ๋์ ์๋ 1์, 5์, 10์, 50์, 100์, 500์์ด ์๋ค. ์ด ๋์ ๋ค๋ก๋ ์ ์์ ๊ธ์ก์ ๋ง๋ค ์ ์์ผ๋ฉฐ ๊ทธ ๋ฐฉ๋ฒ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์๋ค. ์๋ฅผ ๋ค์ด, 30์์ ๋ง๋ค๊ธฐ ์ํด์๋ 1์์ง๋ฆฌ 30๊ฐ ๋๋ 10์์ง๋ฆฌ 2๊ฐ์ 5์์ง๋ฆฌ 2๊ฐ ๋ฑ์ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ๋ค.
+ * ๋์ ์ ์ข
๋ฅ๊ฐ ์ฃผ์ด์ง ๋์ ์ฃผ์ด์ง ๊ธ์ก์ ๋ง๋๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ธ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฒซ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T(1 โค T โค 10)๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ๋์ ์ ๊ฐ์ง ์ N(1 โค N โค 20)์ด ์ฃผ์ด์ง๊ณ ๋ ๋ฒ์งธ ์ค์๋ N๊ฐ์ง ๋์ ์ ๊ฐ ๊ธ์ก์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์ฃผ์ด์ง๋ค. ๊ฐ ๊ธ์ก์ ์ ์๋ก์ 1์๋ถํฐ 10000์๊น์ง ์์ ์ ์์ผ๋ฉฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ค. ์ธ ๋ฒ์งธ ์ค์๋ ์ฃผ์ด์ง N๊ฐ์ง ๋์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ ๊ธ์ก M(1 โค M โค 10000)์ด ์ฃผ์ด์ง๋ค.
+ * ํธ์๋ฅผ ์ํด ๋ฐฉ๋ฒ์ ์๋ 231 - 1 ๋ณด๋ค ์๊ณ , ๊ฐ์ ๋์ ์ด ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
+ *
+ * 3 -> t
+ * 2 -> n
+ * 1 2 -> arr[0], ... , arr[n-1]
+ * 1000 -> m
+ * 3 -> n
+ * 1 5 10 -> arr[0], ... , arr[n-1]
+ * 100 -> m
+ * 2 -> n
+ * 5 7 -> arr[0], ... , arr[n-1]
+ * 22 -> m
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ N๊ฐ์ง ๋์ ์ผ๋ก ๊ธ์ก M์ ๋ง๋๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
+ *
+ * 501
+ * 121
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.088์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Gold.V;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class G5_9084 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine()); // ํ
์คํธ ์ผ์ด์ค ๊ฐ์
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < t; i++) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. ์ฒ์์ผ๋ก ๋์ค๋ ๋์ ์ Start Case ์ค์
+ for (int j = 1; j <= m; j++) {
+ dp[0][j] = j % arr[0] == 0 ? 1 : 0;
+ }
+
+ // * 3. ๋๋ฒ์งธ ๋์ ๋ถํฐ DP
+ for (int j = 1; j < n; j++) {
+ int coin = arr[j];
+
+ dp[j][0] = 1;
+ for (int k = 1; k <= m; k++) {
+ dp[j][k] = dp[j-1][k]; // ์ด์ ๋์ ๊น์ง๋ง ์ฌ์ฉํด์ ๋ํ๋ผ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋จผ์ ์ ์ฅ
+
+ if (k >= coin) {
+ dp[j][k] = dp[j-1][k] + dp[j][k-coin];
+ }
+ }
+ }
+
+ sb.append(dp[n-1][m] + "\n");
+ }
+
+ // * 4. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+
+ m = Integer.parseInt(br.readLine());
+
+ dp = new int[n][m+1];
+ }
+}
diff --git a/java/BOJ/Gold/V/G5_9251.java b/java/BOJ/Gold/V/G5_9251.java
new file mode 100644
index 0000000..c8fb82c
--- /dev/null
+++ b/java/BOJ/Gold/V/G5_9251.java
@@ -0,0 +1,71 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9251
+ *
+ * ? ์ ๋ชฉ: LCS
+ * ? ์๊ฐ ์ ํ: 0.1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
+ * ์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ *
+ * ACAYKP -> word1
+ * CAPCAK -> word2
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 104ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Gold.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class G5_9251 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static char[] word1, word2;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] lcs;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. Bottom-Up ๋ฐฉ์ LCS
+ for (int i = 1; i <= word1.length; i++) {
+ for (int j = 1; j <= word2.length; j++) {
+ if (word1[i - 1] == word2[j - 1]) {
+ lcs[i][j] = lcs[i - 1][j - 1] + 1;
+ } else {
+ lcs[i][j] = Math.max(lcs[i-1][j], lcs[i][j-1]);
+ }
+ }
+ }
+
+ System.out.println(lcs[word1.length][word2.length]);
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ word1 = br.readLine().toCharArray();
+ word2 = br.readLine().toCharArray();
+
+ lcs = new int[word1.length+1][word2.length+1];
+
+ }
+}
diff --git a/java/BOJ/Platinum/IV/P4_11266.java b/java/BOJ/Platinum/IV/P4_11266.java
new file mode 100644
index 0000000..4a92e79
--- /dev/null
+++ b/java/BOJ/Platinum/IV/P4_11266.java
@@ -0,0 +1,151 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/11266
+ *
+ * ! ์ ๋ชฉ: ๋จ์ ์
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ! ๋ฌธ์
+ * ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๋จ์ ์ ์ ๋ชจ๋ ๊ตฌํด ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ๋จ์ ์ ์ด๋ ๊ทธ ์ ์ ์ ์ ๊ฑฐํ์ ๋, ๊ทธ๋ํ๊ฐ ๋ ๊ฐ ๋๋ ๊ทธ ์ด์์ผ๋ก ๋๋์ด์ง๋ ์ ์ ์ ๋งํ๋ค. ์ฆ, ์ ๊ฑฐํ์ ๋ ๊ทธ๋ํ์ connected component์ ๊ฐ์๊ฐ ์ฆ๊ฐํ๋ ์ ์ ์ ๋งํ๋ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ ์ ์ V(1โคVโค10,000), E(1โคEโค100,000)๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ ๊ทธ๋ํ๊ฐ V๊ฐ์ ์ ์ ๊ณผ E๊ฐ์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ์๋ฏธ์ด๋ค. ๋ค์ E๊ฐ์ ์ค์๋ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ A, B๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ์ ์ ๊ณผ B๋ฒ ์ ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์๋ฏธ์ด๋ฉฐ, ๋ฐฉํฅ์ ์๋ฐฉํฅ์ด๋ค.
+ * ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ทธ๋ํ๋ ์ฐ๊ฒฐ ๊ทธ๋ํ๊ฐ ์๋ ์๋ ์๋ค. ์ ์ ์ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค.
+ *
+ * 7 7 -> v e
+ * 1 4 -> a b
+ * 4 5 -> a b
+ * 5 1 -> a b
+ * 1 6 -> a b
+ * 6 7 -> a b
+ * 2 7 -> a b
+ * 7 3 -> a b
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋จ์ ์ ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ๋์งธ ์ค์๋ ๋จ์ ์ ์ ๋ฒํธ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค.
+ *
+ * 3
+ * 1 6 7
+ *
+ * ! ์ฑ์ ๊ฒฐ๊ณผ
+ * ? ์๊ฐ: 404ms
+ * ? ๋ฉ๋ชจ๋ฆฌ: 46MB
+ * ? ์ธ์ด: JAVA8
+ */
+package Platinum.IV;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+public class P4_11266 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int v, e;
+ static ArrayList[] adj;
+
+ // * ์ด๊ธฐ ์ค์
+ static int sequence = 0;
+ static int[] visited;
+ static boolean[] cut;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 1๋ถํฐ V๊น์ง ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๋
ธ๋๋ฅผ ๋ฃจํธ๋
ธ๋๋ก ์ทจ๊ธํ๊ณ DFS ์ํ
+ for (int i = 1; i <= v; i++) {
+ if (visited[i] == 0) {
+ dfs(i, true);
+ }
+ }
+
+ // * ๋จ์ ์ ์ ๊ฐ์์ ๋ฒํธ ์ถ๋ ฅ
+ int count = 0;
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 1; i <= v; i++) {
+ if (cut[i]) {
+ count++;
+ sb.append(i + " ");
+ }
+ }
+
+ bw.write(String.valueOf(count) + "\n");
+ if (count > 0) {
+ bw.write(sb.toString());
+ }
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! DFS
+ public static int dfs(int cur, boolean start) {
+ visited[cur] = ++sequence; // DFS ์์ ์ ์ฅ
+ int ret = visited[cur]; // ๋๋ฌํ ์ ์๋ ๋
ธ๋ ์ค DFS ๋ฐฉ๋ฌธ ์์๊ฐ ๊ฐ์ฅ ์์ ํ์
+ int child = 0; // ์์ ๊ฐ์ (์ฐ๊ฒฐ๋ ๋
ธ๋์ค์ ์ด๋ฏธ visited๊ฐ์ด 0์ด ์๋๋ฉด ์์์ด ์๋๋ผ ๋ถ๋ชจ์)
+
+ // ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ์ธ์ ๋
ธ๋๋ค์ ๋ํ์ฌ
+ for (int i = 0; i < adj[cur].size(); i++) {
+ int next = adj[cur].get(i); // ์ธ์ ๋
ธ๋
+
+ // ์ด๋ฏธ visited๊ฐ์ด 0์ด ์๋๋ผ๋ฉด ๋ถ๋ชจ ๋
ธ๋์ธ ๊ฒ
+ if (visited[next] > 0) {
+ ret = Math.min(ret, visited[next]); // DFS ๋ฐฉ๋ฌธ ์์ ๋ฒํธ ์
๋ฐ์ดํธ
+ continue;
+ }
+
+ child++; // ์์ ๋
ธ๋ ๊ฐ์ ์ถ๊ฐ
+ int prev = dfs(next, false); // ์์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธํ ์ ์๋ ๋
ธ๋ ์ค DFS ๋ฐฉ๋ฌธ ์์๊ฐ ์์ ๊ฐ(์ฌ๊ท)
+
+ // ๋ฃจํธ๋
ธ๋๊ฐ ์๋๋ฉด์ ์์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธํ ์ ์๋ ๋
ธ๋ ์ค DFS ๋ฐฉ๋ฌธ ์์๊ฐ
+ // ํ์ฌ ๋
ธ๋์ DFS ๋ฐฉ๋ฌธ ์์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด ๋จ์ ์
+ if (!start && prev >= visited[cur]) {
+ cut[cur] = true;
+ }
+
+ // DFS ๋ฐฉ๋ฌธ ์์ ๋ฒํธ ์
๋ฐ์ดํธ
+ ret = Math.min(ret, prev);
+ }
+
+ // ๋ฃจํธ๋ผ๋ฉด ์์๋
ธ๋๊ฐ 2๊ฐ ์ด์์ผ ๋ ๋จ์ ์
+ if (start) {
+ cut[cur] = child >= 2;
+ }
+
+ // ๋๋ฌํ ์ ์๋ ๋
ธ๋ ์ค DFS ๋ฐฉ๋ฌธ ์์๊ฐ ๊ฐ์ฅ ์์ ๊ฐ ๋ฆฌํด
+ return ret;
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ v = Integer.parseInt(st.nextToken());
+ e = Integer.parseInt(st.nextToken());
+
+ adj = new ArrayList[v+1];
+ for (int i = 1; i <= v; i++) {
+ adj[i] = new ArrayList<>();
+ }
+
+ for (int i = 0; i < e; i++) {
+ st = new StringTokenizer(br.readLine());
+ int a = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ adj[a].add(b);
+ adj[b].add(a);
+ }
+
+ visited = new int[v+1];
+ cut = new boolean[v+1];
+ }
+}
diff --git a/java/BOJ/Platinum/V/P5_14003.java b/java/BOJ/Platinum/V/P5_14003.java
new file mode 100644
index 0000000..ba00b87
--- /dev/null
+++ b/java/BOJ/Platinum/V/P5_14003.java
@@ -0,0 +1,126 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/14003
+ *
+ * ! ์ ๋ชฉ: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5
+ * ! ์๊ฐ ์ ํ: 3์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ! ๋ฌธ์
+ * ์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 โค N โค 1,000,000)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (-1,000,000,000 โค Ai โค 1,000,000,000)
+ *
+ * 6 -> n
+ * 10 20 10 30 20 50 -> arr
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
+ * ๋์งธ ์ค์๋ ์ ๋ต์ด ๋ ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ * 10 20 30 50
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 1016ms
+ * ๋ฉ๋ชจ๋ฆฌ: 326344KB
+ * ์ธ์ด: JAVA8
+ */
+package Platinum.V;
+
+import java.io.*;
+import java.util.Stack;
+import java.util.StringTokenizer;
+
+public class P5_14003 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // ํ์ฑ
+ static int n, arr[];
+
+ // ์ด๊ธฐ ์ค์
+ static int length;
+ static int[] series, dp;
+
+ // * ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ๋ฐ๊ธฐ
+ LIS(); // * ์ด๋ถํ์์ ์ด์ฉํ LIS
+
+ // ์ฒซ์งธ ์ค์ LIS ๊ธธ์ด ์ ์ฅ
+ StringBuffer sb = new StringBuffer();
+ sb.append(length + "\n");
+
+ // ์์ด์ ๋๋ถํฐ ์์ํด์
+ // ? ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ์ธ๋ฑ์ค๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฐพ์
+ // ๊ธธ์ด๊ฐ 5์๋ค๋ฉด
+ // ๋์์๋ถํฐ ์ธ๋ฑ์ค๊ฐ 4 -> 3 -> 2 -> 1 -> 0์ ์ฐพ์์ ์คํ์ ๋ฃ์
+ Stack stack = new Stack<>();
+ for (int i = n-1; i >= 0; i--) {
+ if (dp[i] == length-1) {
+ length--;
+ stack.push(arr[i]);
+ }
+ }
+
+ // * ์คํ์ ๋งจ ์๋ถํฐ ๋๋ฒ์งธ ์ถ๋ ฅ์ ๋ด์(๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์ค ์์ ๊ฐ๋ถํฐ)
+ while (!stack.isEmpty()) {
+ sb.append(stack.pop() + " ");
+ }
+
+ // * ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ์ด๋ถ ํ์์ ์ด์ฉํ LIS์ ๊ฐ ์์ด์ ์๊ฐ ์ํ๋ LIS์ ์ธ๋ฑ์ค๋ฅผ dp๋ฐฐ์ด์ ์ ์ฅํ๋ ํจ์
+ public static void LIS() {
+ series = new int[n];
+ dp = new int[n];
+
+ series[0] = arr[0];
+ dp[0] = 0;
+ length = 1;
+
+ for (int i = 1; i < n; i++) {
+ if (series[length-1] < arr[i]) {
+ series[length++] = arr[i];
+ dp[i] = length-1;
+ } else {
+ int left = 0;
+ int right = length-1;
+
+ while (left < right) {
+ int mid = (left + right) / 2;
+ if (series[mid] < arr[i]) {
+ left = mid + 1;
+ } else {
+ right = mid;
+ }
+ }
+
+ series[left] = arr[i];
+ dp[i] = left;
+ }
+ }
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Platinum/V/P5_14939.java b/java/BOJ/Platinum/V/P5_14939.java
new file mode 100644
index 0000000..32b3138
--- /dev/null
+++ b/java/BOJ/Platinum/V/P5_14939.java
@@ -0,0 +1,170 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14939
+ *
+ * ? ์ ๋ชฉ: ๋ถ ๋๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ ๊ตฌ 100๊ฐ๊ฐ 10ร10 ์ ์ฌ๊ฐํ ๋ชจ์์ผ๋ก ๋์ด์ ์๋ค. ์ ๊ตฌ์ ๋ฌ๋ฆฐ ์ค์์น๋ฅผ ๋๋ฅด๋ฉด ๊ทธ ์ ๊ตฌ์ ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ์๋ ์ ๊ตฌ์ ์ํ๋ ๋ฐ๋๋ค. ์ ๊ตฌ 100๊ฐ์ ์ํ๊ฐ ์ฃผ์ด์ง๋ฉด ๋ชจ๋ ์ ๊ตฌ๋ฅผ ๋๊ธฐ ์ํด ์ต์ํ์ผ๋ก ๋๋ฌ์ผ ํ๋ ์ค์์น์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ผ
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * 10์ค์ 10๊ธ์์ฉ ์
๋ ฅ์ด ์ฃผ์ด์ง๋ค. #์ ๊บผ์ง ์ ๊ตฌ๊ณ O(๋๋ฌธ์ ์ํ๋ฒณ o)๋ ์ผ์ง ์ ๊ตฌ๋ค. #๊ณผ O์ธ์๋ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์๋๋ค.
+ *
+ * #O######## -> arr[0][0] ~ arr[0][9]
+ * OOO#######
+ * #O########
+ * ####OO####
+ * ###O##O###
+ * ####OO####
+ * ##########
+ * ########O#
+ * #######OOO
+ * ########O# -> arr[9][0] ~ arr[9][9]
+ *
+ * ? ์ถ๋ ฅ
+ * ๋ชจ๋ ์ ๊ตฌ๋ฅผ ๋๊ธฐ ์ํด ์ต์ํ์ผ๋ก ๋๋ฌ์ผ ํ๋ ์ค์์น์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ผ. ๋ถ๊ฐ๋ฅํ๋ฉด -1๋ฅผ ์ถ๋ ฅํ๋ผ.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 104ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 13MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Platinum.V;
+
+import java.io.*;
+
+public class P5_14939 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static boolean[][] arr = new boolean[10][10];
+
+ // * ์ด๊ธฐ ์ค์
+ static int count = 0; // ์ฒซ๋ฒ์งธ ์ค์ ์ค์์น๋ฅผ ์ผ๋ ๊ฒฝ์ฐ์ ์๋ง๋ค ๋ชจ๋ ๋ถ์ ๊ป์ ๋ ์ค์์น๋ฅผ ๋๋ฅธ ํ์
+ static int min = 101; // ์ต์๊ฐ
+ static boolean[] lightCase = new boolean[10]; // ์ด๊ธฐ ๋ถ์ผ์ง ์ํ ๋ฐฐ์ด
+ static boolean[][] light = new boolean[10][10]; // ์ฒซ๋ฒ์งธ ์ค์ ์ค์์น๋ฅผ ์ผ๋ ๊ฒฝ์ฐ์ ์๋ง๋ค ์ด๊ธฐ ๋ถ์ผ์ง ์ํ ๋ฐฐ์ด์ ๊น์๋ณต์ฌ ๋ฐฐ์ด
+
+ // * 5๋ฐฉ(์ํ์ข์ฐ + ํ์ฌ์์น)
+ static int[] dx = {0, 1, -1, 0, 0};
+ static int[] dy = {0, 0, 0, 1, -1};
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ /*
+ * 2. ์ฒซ๋ฒ์งธ ์ค์ ์ค์์น๋ฅผ ์ผ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ
+ * ๋ชจ๋ ๋ถ์ ๋๊ธฐ ์ํด ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก
+ * ํ์ฌ ์ค์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ๋ถ์ด ์ผ์ ธ์์๋ ํด๋น ์ค์์น๋ฅผ ๋๋ฌ์
+ * ํ์ฌ ์ค์ ๋ฐ๋ก ์์ค์ ํ์คํ๊ฒ ๋๋ ๋ฐฉ๋ฒ์ ์ ํ
+ * 10๋ฒ์งธ ์ค์ ์ค์์น๊น์ง ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฅด๊ณ ๋๋ฉด ๋ง์ง๋ง ์ค์ ๋ถ์ ์ํ๋ฅผ ๋ณด๊ณ ๋ชจ๋ ๊บผ์ ธ์์ ๋
+ * count์ ์ต์๊ฐ์ ๋น๊ตํ์ฌ ์
๋ฐ์ดํธ
+ */
+ findCase(0);
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(min == 101 ? -1 : min);
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ for (int i = 0; i < 10; i++) {
+ int p = 0;
+ for (char c : br.readLine().toCharArray()) {
+ arr[i][p++] = c == 'O';
+ }
+ }
+ }
+
+ // ! 2์ฐจ์ ๋ฐฐ์ด ๊น์ ๋ณต์ฌ: light <- arr
+ public static void copy() {
+ for (int i = 0; i < 10; i++) {
+ light[i] = arr[i].clone();
+ }
+ }
+
+ // ! ์ฒซ๋ฒ์งธ ์ค์ ์ค์์น๋ฅผ ๋๋ฅด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ 2^10 = 1024
+ public static void findCase(int len) {
+ if (len == 10) {
+ turnOff();
+ return;
+ }
+
+ lightCase[len] = true;
+ findCase(len+1);
+
+ lightCase[len] = false;
+ findCase(len+1);
+ }
+
+ // ! ๋ชจ๋ ๋ถ์ ๋๊ธฐ ์ํ ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ ์ค ์ค์ ๋ก ๋ชจ๋ ๋ถ์ด ๊บผ์ก์ ๋ count๊ฐ๊ณผ ์ต์๊ฐ์ ๋น๊ตํ์ฌ ์
๋ฐ์ดํธํ๋ ํจ์
+ public static void turnOff() {
+ count = 0; // ์ค์์น ์๋ ํ์ ์ด๊ธฐํ
+ copy(); // ์ด๊ธฐ ๋ถ์ผ์ง ์ํ๋ฅผ ๊น์๋ณต์ฌํด์ ์๋กญ๊ฒ ์ด๊ธฐํ
+
+ // * ์ฒซ๋ฒ์งธ ์ค ์ค์์น ์๋ (lightCase)
+ for (int i = 0; i < 10; i++) {
+ if (lightCase[i]) {
+ count++;
+ for (int j = 0; j < 5; j++) {
+ int ny = dy[j];
+ int nx = i + dx[j];
+
+ if (ny < 0 || nx < 0 || ny >= 10 || nx >= 10) {
+ continue;
+ }
+
+ if (light[ny][nx]) {
+ light[ny][nx] = false;
+ } else {
+ light[ny][nx] = true;
+ }
+ }
+ }
+ }
+
+ // * ์ฒซ๋ฒ์งธ ์ค ์ค์์น ์๋ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์ค์์น ์๋
+ for (int i = 1; i < 10; i++) {
+ for (int j = 0; j < 10; j++) {
+ if (light[i-1][j]) {
+ count++;
+ for (int k = 0; k < 5; k++) {
+ int ny = i + dy[k];
+ int nx = j + dx[k];
+
+ if (ny < 0 || nx < 0 || ny >= 10 || nx >= 10) {
+ continue;
+ }
+
+ if (light[ny][nx]) {
+ light[ny][nx] = false;
+ } else {
+ light[ny][nx] = true;
+ }
+ }
+ }
+ }
+ }
+
+ // * ๋ง์ง๋ง ์ค์ด ๋ชจ๋ ๊บผ์ ธ์์ ๋ ์ต์๊ฐ ์
๋ฐ์ดํธ
+ if (lastCheck() && count < min) {
+ min = count;
+ }
+ }
+
+ // ! ๋ง์ง๋ง ์ค์ ๋ถ์ด ๋ชจ๋ ๊บผ์ก๋์ง ์ฒดํฌํ๋ ํจ์
+ public static boolean lastCheck() {
+ for (int i = 0; i < 10; i++) {
+ if (light[9][i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/java/BOJ/Platinum/V/P5_17071.java b/java/BOJ/Platinum/V/P5_17071.java
new file mode 100644
index 0000000..97f9ba8
--- /dev/null
+++ b/java/BOJ/Platinum/V/P5_17071.java
@@ -0,0 +1,133 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/17071
+ *
+ * ? ์ ๋ชฉ: ์จ๋ฐ๊ผญ์ง 5
+ * ? ์๊ฐ ์ ํ: 0.25์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์๋น์ด๋ ๋์๊ณผ ์จ๋ฐ๊ผญ์ง์ ํ๊ณ ์๋ค. ์๋น์ด๋ ํ์ฌ ์ N(0 โค N โค 500,000)์ ์๊ณ , ๋์์ ์ K(0 โค K โค 500,000)์ ์๋ค. ์๋น์ด๋ ๊ฑท๊ฑฐ๋ ์๊ฐ์ด๋์ ํ ์ ์๋ค. ๋ง์ฝ, ์๋น์ด์ ์์น๊ฐ X์ผ ๋ ๊ฑท๋๋ค๋ฉด 1์ด ํ์ X-1 ๋๋ X+1๋ก ์ด๋ํ๊ฒ ๋๋ค. ์๊ฐ์ด๋์ ํ๋ ๊ฒฝ์ฐ์๋ 1์ด ํ์ 2*X์ ์์น๋ก ์ด๋ํ๊ฒ ๋๋ค. ๋์์ ํญ์ ๊ฑท๊ธฐ๋ง ํ๋ค. ๋์์ ํญ์ ๋งค ์ด๋ง๋ค ์ด๋์ ํ๋ฉฐ, ์ด๋์ ๊ฐ์์ด ๋ถ๋๋ค. ๋์์ด ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๋ ์ด์ ์ ์ด๋ํ ๊ฑฐ๋ฆฌ๋ณด๋ค 1์ ๋ํ ๋งํผ ์ด๋ํ๋ค. ์ฆ, ๋์์ ์ฒ์ ์์น๋ K, 1์ด๊ฐ ์ง๋ ํ ์์น๋ K+1, 2์ด๊ฐ ์ง๋ ํ ์์น๋ K+1+2, 3์ด๊ฐ ์ง๋ ํ์ ์์น๋ K+1+2+3์ด๋ค.
+ * ์๋น์ด์ ๋์์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ์๋น์ด๊ฐ ๋์์ ์ฐพ์ ์ ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ด ๋ช ์ด ํ์ธ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋์์ ์ฐพ๋ ์์น๋ ์ ์ ์ขํ์ด์ด์ผ ํ๊ณ , ์๋น์ด๊ฐ 0๋ณด๋ค ์์ ์ขํ๋ก, 50๋ง๋ณด๋ค ํฐ ์ขํ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ์๋น์ด๊ฐ ์๋ ์์น N๊ณผ ๋์์ด ์๋ ์์น K๊ฐ ์ฃผ์ด์ง๋ค. N๊ณผ K๋ ์ ์์ด๋ค.
+ *
+ * 5 17 -> n m (ํธ์์ k๊ฐ ์๋๋ผ m์ผ๋ก)
+ *
+ * ? ์ถ๋ ฅ
+ * ์๋น์ด๊ฐ ๋์์ ์ฐพ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ์๋น์ด๊ฐ ๋์์ ์ฐพ์ ์ ์๊ฑฐ๋, ์ฐพ๋ ์์น๊ฐ 500,000์ ๋๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 280ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 74MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Platinum.V;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.StringTokenizer;
+
+public class P5_17071 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ // * 2. DP ๋ฐฉ๋ฌธ๋ฆฌ์คํธ ์ด๊ธฐํ
+ dp = new int[500001][2];
+ for (int i = 0; i < dp.length; i++) {
+ for (int j = 0; j < 2; j++) {
+ dp[i][j] = -1;
+ }
+ }
+
+ // * 3. BFS ์ํ
+ bfs();
+
+ // * 4. ์๋น์ด๊ฐ ๋์์ ์ฐพ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ ์ถ๋ ฅ
+ System.out.println(nextLocation());
+ }
+
+ // ! BFS ์ํํด์ n(์๋น)์ด ํด๋น ์์น๊น์ง ๊ฐ ์ ์๋ ์ง์ํ์์ ์ต์๊ฐ, ํ์ํ์์ ์ต์๊ฐ์ ๋ฐ๋ก ๊ตฌํจ
+ // * ์ด๋ ์๊ฐ์ด ์ง์์ผ ๋๋ dp[ํ์ฌ์์น][0] = ์ด๋ ์๊ฐ
+ // * ์ด๋ ์๊ฐ์ด ํ์์ผ ๋๋ dp[ํ์ฌ์์น][1] = ์ด๋ ์๊ฐ
+ public static void bfs() {
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {n, 0});
+ dp[n][0] = 0;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ for (int i = -1; i <= 1; i++) {
+ // ๋ค์ ์์น
+ int next;
+ if (i == 0) {
+ next = cur[0] * 2;
+ } else {
+ next = cur[0] + i;
+ }
+
+ // ๋ฒ์ ์ฒดํฌ
+ if (next < 0 || next > 500000) {
+ continue;
+ }
+
+ int k = cur[1] % 2 == 0 ? 0 : 1; // ํ or ์ง
+
+ if (dp[next][k] == -1) {
+ dp[next][k] = cur[1]+1;
+ queue.add(new int[] {next, cur[1]+1});
+ }
+ }
+ }
+ }
+
+ // ! ํ์ฌ ์์น์์ ์๋น์ด๊ฐ ํด๋น ์์น๋ฅผ ์ต์๋ก ๋ฐฉ๋ฌธํ ํ์์๊ฐ๊ณผ ์ง์์๊ฐ์ ๋น๊ตํ์ฌ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ก๋ ์๊ฐ์ ์ฐพ๋ ํจ์
+ // * 10์ ์์น๋ฅผ ์๋น์ด๊ฐ ํ์๋ก๋ 3ํ, ์ง์๋ก๋ 4ํ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ๊ณ ๋์์ ๊ทธ ์์น๋ฅผ ์๊ฐ์ด 5์ผ๋ ๋ฐฉ๋ฌธํ๋ค๋ฉด
+ // * ํ์ ๋ฐฉ๋ฌธํ์ ๋ 3ํ -> ์์ผ๋ก ๊ฐ๋ค๊ฐ ๋ค์ ๋ค์ด์ค๋ ํ์(+2)๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก 5ํ๊ฐ ์ต์
+ public static int nextLocation() {
+ if (n == m) {
+ return 0;
+ }
+
+ int cur = m;
+ int time = 0;
+ int min = Integer.MAX_VALUE;
+
+ while (true) {
+ time++;
+ cur += time;
+
+ if (cur > 500000) {
+ break;
+ }
+
+ if (time >= dp[cur][0] && (time % 2 == dp[cur][0] % 2)) {
+ min = Math.min(min, time);
+ }
+
+ if (time >= dp[cur][1] && (time % 2 == dp[cur][1] % 2)) {
+ min = Math.min(min, time);
+ }
+ }
+
+ return min == Integer.MAX_VALUE ? -1 : min;
+ }
+}
diff --git a/java/BOJ/Platinum/V/P5_2887.java b/java/BOJ/Platinum/V/P5_2887.java
new file mode 100644
index 0000000..61baf6a
--- /dev/null
+++ b/java/BOJ/Platinum/V/P5_2887.java
@@ -0,0 +1,143 @@
+/**
+ * ! ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? address: https://www.acmicpc.net/problem/2887
+ *
+ * ! ์ ๋ชฉ: ํ์ฑ ํฐ๋
+ * ! ์๊ฐ ์ ํ: 1์ด
+ * ! ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ! ๋ฌธ์
+ * ๋๋ 2040๋
, ์ด๋ฏผํ์ ์ฐ์ฃผ์ ์์ ๋ง์ ์๊ตญ์ ๋ง๋ค์๋ค. ์๊ตญ์ N๊ฐ์ ํ์ฑ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ฏผํ์ด๋ ์ด ํ์ฑ์ ํจ์จ์ ์ผ๋ก ์ง๋ฐฐํ๊ธฐ ์ํด์ ํ์ฑ์ ์ฐ๊ฒฐํ๋ ํฐ๋์ ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ํ์ฑ์ 3์ฐจ์ ์ขํ์์ ํ ์ ์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค. ๋ ํ์ฑ A(xA, yA, zA)์ B(xB, yB, zB)๋ฅผ ํฐ๋๋ก ์ฐ๊ฒฐํ ๋ ๋๋ ๋น์ฉ์ min(|xA-xB|, |yA-yB|, |zA-zB|)์ด๋ค.
+ * ๋ฏผํ์ด๋ ํฐ๋์ ์ด N-1๊ฐ ๊ฑด์คํด์ ๋ชจ๋ ํ์ฑ์ด ์๋ก ์ฐ๊ฒฐ๋๊ฒ ํ๋ ค๊ณ ํ๋ค. ์ด๋, ๋ชจ๋ ํ์ฑ์ ํฐ๋๋ก ์ฐ๊ฒฐํ๋๋ฐ ํ์ํ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ! ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ์ฑ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 100,000) ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ํ์ฑ์ x, y, z์ขํ๊ฐ ์ฃผ์ด์ง๋ค. ์ขํ๋ -109๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 109๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ํ ์์น์ ํ์ฑ์ด ๋ ๊ฐ ์ด์ ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
+ *
+ * 5 -> n
+ * 11 -15 -15 -> x y z
+ * 14 -5 -15 -> x y z
+ * -1 -1 -5 -> x y z
+ * 10 -4 -1 -> x y z
+ * 19 -4 19 -> x y z
+ *
+ * ! ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ชจ๋ ํ์ฑ์ ํฐ๋๋ก ์ฐ๊ฒฐํ๋๋ฐ ํ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * ์๊ฐ: 1360ms
+ * ๋ฉ๋ชจ๋ฆฌ: 79808KB
+ * ์ธ์ด: JAVA8
+ */
+package Platinum.V;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.stream.IntStream;
+
+public class P5_2887 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static ArrayList nodeList = new ArrayList<>();
+
+ // * ์ด๊ธฐ ์ค์
+ static int cost = 0; // ์ต์ ๋น์ฉ
+ static int[] parent; // ํฉ์งํฉ
+
+ // * X์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ, Y์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ, Z์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก Edge๋ ์ ์ฅํ๋ ๋ฆฌ์คํธ
+ static ArrayList edgeList = new ArrayList<>();
+
+ // * 3์ฐจ์ ์ขํ -> X์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ Edge, Y์ขํ๊ฐ์ Edge, Z์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ Edge
+ static class Edge {
+ int from;
+ int to;
+ int weight;
+
+ public Edge(int from, int to, int weight) {
+ this.from = from;
+ this.to = to;
+ this.weight = weight;
+ }
+ }
+
+ // ! ๋ฉ์ธ
+ public static void main(String[] args) throws IOException {
+ input(); // * ์
๋ ฅ ๋ฐ๊ธฐ
+ // * X, Y, Z๋ฅผ ์ค์ฌ์ผ๋ก ๊ฐ๊ฐ 3๋ฒ ์ ๋ ฌ ํ X์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ, Y์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ, Z์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก Edge๋ฅผ ๋ง๋ค์ด edgeList์ ์ฝ์
+ for (int k = 1; k <= 3; k++) {
+ int sortingCoordinate = k;
+ nodeList.sort((a, b) -> a[sortingCoordinate] - b[sortingCoordinate]);
+
+ for (int i = 0; i < n-1; i++) {
+ Edge edge = new Edge(nodeList.get(i)[0], nodeList.get(i+1)[0], Math.abs(nodeList.get(i)[k] - nodeList.get(i+1)[k]));
+ edgeList.add(edge);
+ }
+ }
+ kruskal(); // * ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
+ bw.write(String.valueOf(cost)); // * ์ต์๋น์ฉ ์ถ๋ ฅ
+
+ // ๋ซ๊ธฐ
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
+ public static void kruskal() {
+ int count = 0;
+ edgeList.sort((a, b) -> a.weight - b.weight); // * edgeList๋ฅผ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
+ for (int i = 0; i < edgeList.size(); i++) {
+ if (count == n-1) break; // * ์ต์ ์คํจ๋ ํธ๋ฆฌ๊ฐ ์์ฑ๋์๋ค๋ฉด ์ข
๋ฃ
+
+ Edge edge = edgeList.get(i); // * ๊ฐ์ ์ ํ
+ if (union(edge.from, edge.to)) { // * ์ธ์ดํด์ด ๋ฐ์ํ์ง ์๋๋ค๋ฉด ํด๋น ๊ฐ์ ์ ์ ํํ๊ณ ๊ฐ์ค์น๋ฅผ cost์ ๋ํจ
+ count++;
+ cost += edge.weight;
+ }
+ }
+ }
+
+ // ! UNION_FIND ํฉ์งํฉ ์ฐพ๊ธฐ
+ public static int findParent(int node) {
+ if (parent[node] != node) {
+ parent[node] = findParent(parent[node]);
+ }
+ return parent[node];
+ }
+
+ // ! UNION_FIND ํฉ์งํฉ ์ฐพ๊ธฐ
+ public static boolean union(int a, int b) {
+ a = findParent(a);
+ b = findParent(b);
+ if (a == b) return false;
+
+ if (a < b) parent[b] = a;
+ else parent[a] = b;
+
+ return true;
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ int x = Integer.parseInt(st.nextToken());
+ int y = Integer.parseInt(st.nextToken());
+ int z = Integer.parseInt(st.nextToken());
+
+ // * [์ขํ๋ฒํธ, X์ขํ, Y์ขํ, Z์ขํ]
+ nodeList.add(new int[] {i, x, y, z});
+ }
+
+ parent = IntStream.range(0, n).toArray();
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_10844.java b/java/BOJ/Silver/I/S1_10844.java
new file mode 100644
index 0000000..51f6cc4
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_10844.java
@@ -0,0 +1,74 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/10844
+ *
+ * ? ์ ๋ชฉ: ์ฌ์ด ๊ณ๋จ ์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * 45656์ด๋ ์๋ฅผ ๋ณด์.
+ * ์ด ์๋ ์ธ์ ํ ๋ชจ๋ ์๋ฆฌ์ ์ฐจ์ด๊ฐ 1์ด๋ค. ์ด๋ฐ ์๋ฅผ ๊ณ๋จ ์๋ผ๊ณ ํ๋ค.
+ * N์ด ์ฃผ์ด์ง ๋, ๊ธธ์ด๊ฐ N์ธ ๊ณ๋จ ์๊ฐ ์ด ๋ช ๊ฐ ์๋์ง ๊ตฌํด๋ณด์. 0์ผ๋ก ์์ํ๋ ์๋ ๊ณ๋จ์๊ฐ ์๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. N์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+ *
+ * 1 -> n
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ ๋ต์ 1,000,000,000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 9
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 76ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S1_10844 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ int n = Integer.parseInt(br.readLine());
+
+ // * ์ด๊ธฐ ์ค์
+ int answer = 0;
+ int div = 1_000_000_000;
+ int[][] dp = new int[10][n+1];
+
+ // * 2. DP(Tabulation)
+ for (int i = 1; i <= 9; i++) {
+ dp[i][1] = 1;
+ }
+
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j < 10; j++) {
+ if (j-1 >= 0) {
+ dp[j-1][i+1] = (dp[j-1][i+1] % div + dp[j][i] % div) % div;
+ }
+
+ if (j+1 < 10) {
+ dp[j+1][i+1] = (dp[j+1][i+1] % div + dp[j][i] % div) % div;
+ }
+ }
+ }
+
+ // * 3. 1์์๋ฆฌ์ 0๋ถํฐ 9๊น์ง ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ํฉ(+๋๋จธ์ง์ฐ์ฐ)
+ for (int i = 0; i < 10; i++) {
+ answer = (answer % div + dp[i][n] % div) % div;
+ }
+
+ // * 4. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(answer);
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_11048.java b/java/BOJ/Silver/I/S1_11048.java
new file mode 100644
index 0000000..b91bf9a
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_11048.java
@@ -0,0 +1,96 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11048
+ *
+ * ? ์ ๋ชฉ: ์ด๋ํ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ค๊ท๋ NรM ํฌ๊ธฐ์ ๋ฏธ๋ก์ ๊ฐํ์๋ค. ๋ฏธ๋ก๋ 1ร1ํฌ๊ธฐ์ ๋ฐฉ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๊ฐ ๋ฐฉ์๋ ์ฌํ์ด ๋์ฌ์ ธ ์๋ค. ๋ฏธ๋ก์ ๊ฐ์ฅ ์ผ์ชฝ ์ ๋ฐฉ์ (1, 1)์ด๊ณ , ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ ๋ฐฉ์ (N, M)์ด๋ค.
+ * ์ค๊ท๋ ํ์ฌ (1, 1)์ ์๊ณ , (N, M)์ผ๋ก ์ด๋ํ๋ ค๊ณ ํ๋ค. ์ค๊ท๊ฐ (r, c)์ ์์ผ๋ฉด, (r+1, c), (r, c+1), (r+1, c+1)๋ก ์ด๋ํ ์ ์๊ณ , ๊ฐ ๋ฐฉ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ฐฉ์ ๋์ฌ์ ธ์๋ ์ฌํ์ ๋ชจ๋ ๊ฐ์ ธ๊ฐ ์ ์๋ค. ๋, ๋ฏธ๋ก ๋ฐ์ผ๋ก ๋๊ฐ ์๋ ์๋ค.
+ * ์ค๊ท๊ฐ (N, M)์ผ๋ก ์ด๋ํ ๋, ๊ฐ์ ธ์ฌ ์ ์๋ ์ฌํ ๊ฐ์์ ์ต๋๊ฐ์ ๊ตฌํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ฏธ๋ก์ ํฌ๊ธฐ N, M์ด ์ฃผ์ด์ง๋ค. (1 โค N, M โค 1,000)
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ์ด M๊ฐ์ ์ซ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, r๋ฒ์งธ ์ค์ c๋ฒ์งธ ์๋ (r, c)์ ๋์ฌ์ ธ ์๋ ์ฌํ์ ๊ฐ์์ด๋ค. ์ฌํ์ ๊ฐ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+ *
+ * 3 4 -> n m
+ * 1 2 3 4 -> arr[0][0] ~ arr[0][m-1]
+ * 0 0 0 5
+ * 9 8 7 6 -> arr[n-1][0] ~ arr[n-1][m-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ค๊ท๊ฐ (N, M)์ผ๋ก ์ด๋ํ ๋, ๊ฐ์ ธ์ฌ ์ ์๋ ์ฌํ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 31
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.5์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 75MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class S1_11048 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ // * ๋ฐฉํฅ ์ค์
+ static int[] dx = {1, 1, 0};
+ static int[] dy = {1, 0, 1};
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ for (int k = 0; k < 3; k++) {
+ int ny = i + dy[k];
+ int nx = j + dx[k];
+
+ if (ny < 0 || nx < 0 || ny >= n || nx >= m) {
+ continue;
+ }
+
+ dp[ny][nx] = Math.max(dp[ny][nx], dp[i][j] + arr[ny][nx]);
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(dp[n-1][m-1]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][m];
+ dp = new int[n][m];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < m; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ dp[i][j] = arr[i][j];
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_11052.java b/java/BOJ/Silver/I/S1_11052.java
new file mode 100644
index 0000000..3740367
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_11052.java
@@ -0,0 +1,88 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11052
+ *
+ * ? ์ ๋ชฉ: ์นด๋ ๊ตฌ๋งคํ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ฆ ๋ฏผ๊ท๋ค ๋๋ค์์๋ ์คํํธ๋งํฌ์์ ๋ง๋ PS์นด๋๋ฅผ ๋ชจ์ผ๋ ๊ฒ์ด ์ ํ์ด๋ค.
+ * PS์นด๋๋ PS(Problem Solving)๋ถ์ผ์์ ์ ๋ช
ํ ์ฌ๋๋ค์ ์์ด๋์ ์ผ๊ตด์ด ์ ํ์๋ ์นด๋์ด๋ค. ๊ฐ๊ฐ์ ์นด๋์๋ ๋ฑ๊ธ์ ๋ํ๋ด๋ ์์ด ์น ํด์ ธ ์๊ณ , ๋ค์๊ณผ ๊ฐ์ด 8๊ฐ์ง๊ฐ ์๋ค.
+ *
+ * ์ ์ค์นด๋
+ * ๋ ๋์นด๋
+ * ์ค๋ ์ง์นด๋
+ * ํผํ์นด๋
+ * ๋ธ๋ฃจ์นด๋
+ * ์ฒญ๋ก์นด๋
+ * ๊ทธ๋ฆฐ์นด๋
+ * ๊ทธ๋ ์ด์นด๋
+ *
+ * ์นด๋๋ ์นด๋ํฉ์ ํํ๋ก๋ง ๊ตฌ๋งคํ ์ ์๊ณ , ์นด๋ํฉ์ ์ข
๋ฅ๋ ์นด๋ 1๊ฐ๊ฐ ํฌํจ๋ ์นด๋ํฉ, ์นด๋ 2๊ฐ๊ฐ ํฌํจ๋ ์นด๋ํฉ, ... ์นด๋ N๊ฐ๊ฐ ํฌํจ๋ ์นด๋ํฉ๊ณผ ๊ฐ์ด ์ด N๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
+ * ๋ฏผ๊ท๋ ์นด๋์ ๊ฐ์๊ฐ ์ ์ ํฉ์ด๋๋ผ๋ ๊ฐ๊ฒฉ์ด ๋น์ธ๋ฉด ๋์ ๋ฑ๊ธ์ ์นด๋๊ฐ ๋ง์ด ๋ค์ด์์ ๊ฒ์ด๋ผ๋ ๋ฏธ์ ์ ๋ฏฟ๊ณ ์๋ค. ๋ฐ๋ผ์, ๋ฏผ๊ท๋ ๋์ ์ต๋ํ ๋ง์ด ์ง๋ถํด์ ์นด๋ N๊ฐ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋ค. ์นด๋๊ฐ i๊ฐ ํฌํจ๋ ์นด๋ํฉ์ ๊ฐ๊ฒฉ์ Pi์์ด๋ค.
+ * ์๋ฅผ ๋ค์ด, ์นด๋ํฉ์ด ์ด 4๊ฐ์ง ์ข
๋ฅ๊ฐ ์๊ณ , P1 = 1, P2 = 5, P3 = 6, P4 = 7์ธ ๊ฒฝ์ฐ์ ๋ฏผ๊ท๊ฐ ์นด๋ 4๊ฐ๋ฅผ ๊ฐ๊ธฐ ์ํด ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ 10์์ด๋ค. 2๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ 2๋ฒ ์ฌ๋ฉด ๋๋ค.
+ * P1 = 5, P2 = 2, P3 = 8, P4 = 10์ธ ๊ฒฝ์ฐ์๋ ์นด๋๊ฐ 1๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ 4๋ฒ ์ฌ๋ฉด 20์์ด๊ณ , ์ด ๊ฒฝ์ฐ๊ฐ ๋ฏผ๊ท๊ฐ ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ด๋ค.
+ * ๋ง์ง๋ง์ผ๋ก, P1 = 3, P2 = 5, P3 = 15, P4 = 16์ธ ๊ฒฝ์ฐ์๋ 3๊ฐ ๋ค์ด์๋ ์นด๋ํฉ๊ณผ 1๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ ๊ตฌ๋งคํด 18์์ ์ง๋ถํ๋ ๊ฒ์ด ์ต๋๊ฐ์ด๋ค.
+ * ์นด๋ ํฉ์ ๊ฐ๊ฒฉ์ด ์ฃผ์ด์ก์ ๋, N๊ฐ์ ์นด๋๋ฅผ ๊ตฌ๋งคํ๊ธฐ ์ํด ๋ฏผ๊ท๊ฐ ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. N๊ฐ๋ณด๋ค ๋ง์ ๊ฐ์์ ์นด๋๋ฅผ ์ฐ ๋ค์, ๋๋จธ์ง ์นด๋๋ฅผ ๋ฒ๋ ค์ N๊ฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ์ฆ, ๊ตฌ๋งคํ ์นด๋ํฉ์ ํฌํจ๋์ด ์๋ ์นด๋ ๊ฐ์์ ํฉ์ N๊ณผ ๊ฐ์์ผ ํ๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ฏผ๊ท๊ฐ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋ ์นด๋์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 1,000)
+ * ๋์งธ ์ค์๋ Pi๊ฐ P1๋ถํฐ PN๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. (1 โค Pi โค 10,000)
+ *
+ * 4
+ * 1 5 6 7
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฏผ๊ท๊ฐ ์นด๋ N๊ฐ๋ฅผ ๊ฐ๊ธฐ ์ํด ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 10
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 100ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class S1_11052 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] price;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ int[] dp = price.clone(); // * 2. DP Table ์ด๊ธฐํ
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int i = 1; i <= n; i++) {
+ for (int j = i; j <= n; j++) {
+ dp[j] = Math.max(dp[j], dp[j-i] + price[i]);
+ }
+ }
+
+ // * 4. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(dp[n]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ price = new int[n+1];
+ st = new StringTokenizer(br.readLine());
+ for (int i = 1; i <= n; i++) {
+ price[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_11057.java b/java/BOJ/Silver/I/S1_11057.java
new file mode 100644
index 0000000..8a80d1b
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_11057.java
@@ -0,0 +1,66 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11057
+ *
+ * ? ์ ๋ชฉ: ์ค๋ฅด๋ง ์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ค๋ฅด๋ง ์๋ ์์ ์๋ฆฌ๊ฐ ์ค๋ฆ์ฐจ์์ ์ด๋ฃจ๋ ์๋ฅผ ๋งํ๋ค. ์ด๋, ์ธ์ ํ ์๊ฐ ๊ฐ์๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์น๋ค.
+ * ์๋ฅผ ๋ค์ด, 2234์ 3678, 11119๋ ์ค๋ฅด๋ง ์์ด์ง๋ง, 2232, 3676, 91111์ ์ค๋ฅด๋ง ์๊ฐ ์๋๋ค.
+ * ์์ ๊ธธ์ด N์ด ์ฃผ์ด์ก์ ๋, ์ค๋ฅด๋ง ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋ 0์ผ๋ก ์์ํ ์ ์๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ N (1 โค N โค 1,000)์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 2
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ธธ์ด๊ฐ N์ธ ์ค๋ฅด๋ง ์์ ๊ฐ์๋ฅผ 10,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 55
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 76ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S1_11057 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ + ์ด๊ธฐ ์ค์
+ int n = Integer.parseInt(br.readLine());
+ int div = 10_007;
+
+ // * 2. DP Table ์ด๊ธฐํ + Start Case ์ค์
+ int[][] dp = new int[10][n+1];
+ for (int i = 0; i < 10; i++) {
+ dp[i][1] = 1;
+ }
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int j = 1; j < n; j++) {
+ for (int i = 0; i < 10; i++) {
+ for (int k = i; k < 10; k++) {
+ dp[k][j+1] = (dp[k][j+1] % div + dp[i][j] % div ) % div;
+ }
+ }
+ }
+
+ // * 4. ์ ๋ต ๊ณ์ฐ ๋ฐ ์ถ๋ ฅ
+ int answer = 0;
+ for (int i = 0; i < 10; i++) {
+ answer = (answer % div + dp[i][n] % div) % div;
+ }
+ System.out.println(answer);
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_11660.java b/java/BOJ/Silver/I/S1_11660.java
new file mode 100644
index 0000000..8eceb59
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_11660.java
@@ -0,0 +1,131 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11660
+ *
+ * ? ์ ๋ชฉ: ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * NรN๊ฐ์ ์๊ฐ NรN ํฌ๊ธฐ์ ํ์ ์ฑ์์ ธ ์๋ค. (x1, y1)๋ถํฐ (x2, y2)๊น์ง ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. (x, y)๋ xํ y์ด์ ์๋ฏธํ๋ค.
+ * ์๋ฅผ ๋ค์ด, N = 4์ด๊ณ , ํ๊ฐ ์๋์ ๊ฐ์ด ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
+ *
+ * 1 2 3 4
+ * 2 3 4 5
+ * 3 4 5 6
+ * 4 5 6 7
+ * ์ฌ๊ธฐ์ (2, 2)๋ถํฐ (3, 4)๊น์ง ํฉ์ ๊ตฌํ๋ฉด 3+4+5+4+5+6 = 27์ด๊ณ , (4, 4)๋ถํฐ (4, 4)๊น์ง ํฉ์ ๊ตฌํ๋ฉด 7์ด๋ค.
+ * ํ์ ์ฑ์์ ธ ์๋ ์์ ํฉ์ ๊ตฌํ๋ ์ฐ์ฐ์ด ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ์ ํฌ๊ธฐ N๊ณผ ํฉ์ ๊ตฌํด์ผ ํ๋ ํ์ M์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 1024, 1 โค M โค 100,000) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ํ์ ์ฑ์์ ธ ์๋ ์๊ฐ 1ํ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ค ๊ฐ์ ์ ์ x1, y1, x2, y2 ๊ฐ ์ฃผ์ด์ง๋ฉฐ, (x1, y1)๋ถํฐ (x2, y2)์ ํฉ์ ๊ตฌํด ์ถ๋ ฅํด์ผ ํ๋ค. ํ์ ์ฑ์์ ธ ์๋ ์๋ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. (x1 โค x2, y1 โค y2)
+ *
+ * 4 3 -> n m
+ * 1 2 3 4 -> arr[0][0] ~ arr[0][n-1]
+ * 2 3 4 5
+ * 3 4 5 6
+ * 4 5 6 7 -> arr[n-1][0] ~ arr[n-1][n-1]
+ * 2 2 3 4 -> test[0] ~ test[0][3]
+ * 3 4 3 4
+ * 1 1 4 4 -> test[m-1][0] ~ test[m-1][3]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ด M์ค์ ๊ฑธ์ณ (x1, y1)๋ถํฐ (x2, y2)๊น์ง ํฉ์ ๊ตฌํด ์ถ๋ ฅํ๋ค.
+ *
+ * 27
+ * 6
+ * 64
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.724์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 144MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Silver.I;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S1_11660 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n, m;
+ static int[][] arr;
+ static int[][] test;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up): ๋์ ํฉ ๊ตฌํ๊ธฐ
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (i-1 >= 0 && j-1 >= 0) {
+ dp[i][j] = dp[i][j] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
+ } else if (i-1 >= 0) {
+ dp[i][j] += dp[i-1][j];
+ } else if (j-1 >= 0) {
+ dp[i][j] += dp[i][j-1];
+ }
+ }
+ }
+
+ // * 3. ๊ตฌ๊ฐํฉ ๊ตฌํ๊ธฐ(์ค๋ณต์ ๊ฑฐ)
+ StringBuffer sb = new StringBuffer();
+ for (int[] t : test) {
+ int sum = 0;
+ if (t[0]-1 >= 0 && t[1]-1 >= 0) {
+ sum = dp[t[2]][t[3]]
+ - dp[t[0]-1][t[3]]
+ - dp[t[2]][t[1]-1]
+ + dp[t[0]-1][t[1]-1];
+ } else if (t[0]-1 >= 0) {
+ sum = dp[t[2]][t[3]] - dp[t[0]-1][t[3]];
+ } else if (t[1]-1 >= 0) {
+ sum = dp[t[2]][t[3]] - dp[t[2]][t[1]-1];
+ } else {
+ sum = dp[t[2]][t[3]];
+ }
+ sb.append(sum + "\n");
+ }
+
+ // * 4. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n][n];
+ test = new int[m][4];
+ dp = new int[n][n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ dp[i][j] = arr[i][j];
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < 4; j++) {
+ test[i][j] = Integer.parseInt(st.nextToken()) - 1;
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_1189.java b/java/BOJ/Silver/I/S1_1189.java
new file mode 100644
index 0000000..d233dc6
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_1189.java
@@ -0,0 +1,102 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * https://www.acmicpc.net/problem/1189
+ *
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ? ํ์๋ ์บ ํ๋ฅผ ๋ง์น๊ณ ์ง์ ๋์๊ฐ๋ ค ํ๋ค. ํ์๋ ํ์ฌ ์ผ์ชฝ ์๋์ ์ ์๊ณ ์ง์ ์ค๋ฅธ์ชฝ ์์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์๋ ์ง์ ๋์๊ฐ๋ ๋ฐฉ๋ฒ์ด ๋ค์ํ๋ค. ๋จ, ํ์๋ ๋๋ํ์ฌ ํ๋ฒ ์ง๋์น ๊ณณ์ ๋ค์ ๋ฐฉ๋ฌธํ์ง๋ ์๋๋ค.
+ *
+ * cdef ...f ..ef ..gh cdeh cdej ...f
+ * bT.. .T.e .Td. .Tfe bTfg bTfi .Tde
+ * a... abcd abc. abcd a... a.gh abc.
+ * ๊ฑฐ๋ฆฌ : 6 6 6 8 8 10 6
+ *
+ * ์ ์์ ๋ ํ์๊ฐ ์ง์ ๋์๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. T๋ก ํ์๋ ๋ถ๋ถ์ ๊ฐ์ง ๋ชปํ๋ ๋ถ๋ถ์ด๋ค. ๋ฌธ์ ๋ R x C ๋งต์ ๋ชป๊ฐ๋ ๋ถ๋ถ์ด ์ฃผ์ด์ง๊ณ ๊ฑฐ๋ฆฌ K๊ฐ ์ฃผ์ด์ง๋ฉด ํ์๊ฐ ์ง๊น์ง๋ ๋์ฐฉํ๋ ๊ฒฝ์ฐ ์ค ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๊ฐ์ง์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ ์ค์ ์ ์ R(1 โค R โค 5), C(1 โค C โค 5), K(1 โค K โค RรC)๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ๋ถํฐ R+1๋ฒ์งธ ์ค๊น์ง๋ RรC ๋งต์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ '.'๊ณผ 'T'๋ก ๊ตฌ์ฑ๋ ๊ธธ์ด๊ฐ C์ธ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 3 4 6 -> r c k
+ * .... -> arr[0][0] ~ arr[0][c-1]
+ * .T..
+ * .... -> arr[r-1][0] ~ arr[r-1][c-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ์ค์ ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๊ฐ์ง์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.096์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 12MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class S1_1189 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int r, c, k;
+ static int count = 0;
+
+ static char[][] arr;
+ static boolean[][] visit;
+
+ static int[] dx = {1, -1, 0, 0};
+ static int[] dy = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ visit[r-1][0] = true;
+ dfs(r-1, 0, 1);
+
+ System.out.println(count);
+ }
+
+ public static void dfs(int x, int y, int len) {
+ if (x == 0 && y == c-1) {
+ if (len == k) {
+ count++;
+ }
+ return;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = x + dx[i];
+ int ny = y + dy[i];
+
+ if (nx < 0 || ny < 0 || nx >= r || ny >= c || visit[nx][ny] || arr[nx][ny] == 'T') {
+ continue;
+ }
+
+ visit[nx][ny] = true;
+ dfs(nx, ny, len+1);
+ visit[nx][ny] = false;
+ }
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+
+ r = Integer.parseInt(st.nextToken());
+ c = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ arr = new char[r][c];
+ visit = new boolean[r][c];
+
+ for (int i = 0; i < r; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_1309.java b/java/BOJ/Silver/I/S1_1309.java
new file mode 100644
index 0000000..7a091d2
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_1309.java
@@ -0,0 +1,73 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * https://www.acmicpc.net/problem/1309
+ *
+ * ? ์ ๋ชฉ: ๋๋ฌผ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ด๋ค ๋๋ฌผ์์ ๊ฐ๋ก๋ก ๋์นธ ์ธ๋ก๋ก N์นธ์ธ ์๋์ ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์๋ค.
+ * ์ด ๋๋ฌผ์์๋ ์ฌ์๋ค์ด ์ด๊ณ ์๋๋ฐ ์ฌ์๋ค์ ์ฐ๋ฆฌ์ ๊ฐ๋ ๋, ๊ฐ๋ก๋ก๋ ์ธ๋ก๋ก๋ ๋ถ์ด ์๊ฒ ๋ฐฐ์นํ ์๋ ์๋ค. ์ด ๋๋ฌผ์ ์กฐ๋ จ์ฌ๋ ์ฌ์๋ค์ ๋ฐฐ์น ๋ฌธ์ ๋๋ฌธ์ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์๊ณ ์๋ค.
+ * ๋๋ฌผ์ ์กฐ๋ จ์ฌ์ ๋จธ๋ฆฌ๊ฐ ์ํ์ง ์๋๋ก ์ฐ๋ฆฌ๊ฐ 2*N ๋ฐฐ์ด์ ์ฌ์๋ฅผ ๋ฐฐ์นํ๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ช ๊ฐ์ง์ธ์ง๋ฅผ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด ์ฃผ๋๋ก ํ์. ์ฌ์๋ฅผ ํ ๋ง๋ฆฌ๋ ๋ฐฐ์นํ์ง ์๋ ๊ฒฝ์ฐ๋ ํ๋์ ๊ฒฝ์ฐ์ ์๋ก ์น๋ค๊ณ ๊ฐ์ ํ๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ฐ๋ฆฌ์ ํฌ๊ธฐ N(1โคNโค100,000)์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 4
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ฌ์๋ฅผ ๋ฐฐ์นํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ 9901๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ.
+ *
+ * 41
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.092์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S1_1309 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ int n = Integer.parseInt(br.readLine());
+
+ // * ์ด๊ธฐ ์ค์
+ int div = 9901;
+
+ // * DP ํ
์ด๋ธ ์ด๊ธฐํ
+ int[][] dp = new int[n+1][3];
+
+ // * Start Case ์ค์
+ dp[1][0] = 1;
+ dp[1][1] = 1;
+ dp[1][2] = 1;
+
+ /*
+ 0 : ํด๋น ์ค์ ์๋ฌด๊ฒ๋ ์ ํํ์ง ์์
+ 1 : ํด๋น ์ค์ ์ผ์ชฝ์ ์ ํํจ
+ 2 : ํด๋น ์ค์ ์ค๋ฅธ์ชฝ์ ์ ํํจ
+ */
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 2; i <= n; i++) {
+ dp[i][0] = ((dp[i-1][0] % div + dp[i-1][1] % div) % div + dp[i-1][2] % div) % div;
+ dp[i][1] = (dp[i-1][0] % div + dp[i-1][2]) % div;
+ dp[i][2] = (dp[i-1][0] % div + dp[i-1][1] % div) % div;
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(
+ ((dp[n][0] % div + dp[n][1] % div) % div
+ + dp[n][2] % div) % div
+ );
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_1890.java b/java/BOJ/Silver/I/S1_1890.java
new file mode 100644
index 0000000..a9b1543
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_1890.java
@@ -0,0 +1,91 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1890
+ *
+ * ? ์ ๋ชฉ: ์ ํ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * NรN ๊ฒ์ํ์ ์๊ฐ ์ ํ์ ธ ์๋ค. ์ด ๊ฒ์์ ๋ชฉํ๋ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๊ท์น์ ๋ง๊ฒ ์ ํ๋ฅผ ํด์ ๊ฐ๋ ๊ฒ์ด๋ค.
+ * ๊ฐ ์นธ์ ์ ํ์๋ ์๋ ํ์ฌ ์นธ์์ ๊ฐ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋์ ์ค๋ฅธ์ชฝ์ด๋ ์๋์ชฝ์ผ๋ก๋ง ์ด๋ํด์ผ ํ๋ค. 0์ ๋ ์ด์ ์งํ์ ๋ง๋ ์ข
์ฐฉ์ ์ด๋ฉฐ, ํญ์ ํ์ฌ ์นธ์ ์ ํ์๋ ์๋งํผ ์ค๋ฅธ์ชฝ์ด๋ ์๋๋ก ๊ฐ์ผ ํ๋ค. ํ ๋ฒ ์ ํ๋ฅผ ํ ๋, ๋ฐฉํฅ์ ๋ฐ๊พธ๋ฉด ์ ๋๋ค. ์ฆ, ํ ์นธ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ํ๋ฅผ ํ๊ฑฐ๋, ์๋๋ก ์ ํ๋ฅผ ํ๋ ๋ ๊ฒฝ์ฐ๋ง ์กด์ฌํ๋ค.
+ * ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๊ท์น์ ๋ง๊ฒ ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ฒ์ ํ์ ํฌ๊ธฐ N (4 โค N โค 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ์นธ์ ์ ํ์ ธ ์๋ ์๊ฐ N๊ฐ์ฉ ์ฃผ์ด์ง๋ค. ์นธ์ ์ ํ์๋ ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 9๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ฉฐ, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์๋ ํญ์ 0์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 4 -> n
+ * 2 3 3 1 -> arr[0][0] ~ arr[0][n-1]
+ * 1 2 1 3
+ * 1 2 3 1
+ * 3 1 1 0 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๋ฌธ์ ์ ๊ท์น์ ๋ง๊ฒ ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฒฝ๋ก์ ๊ฐ์๋ 263-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+ *
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.08์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 3
+ */
+package Silver.I;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S1_1890 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static long[][] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ dp[0][0] = 1L; // * Start Case ์ค์
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ int k = arr[i][j];
+
+ if (k == 0) {
+ break;
+ }
+
+ if (i+k < n) {
+ dp[i+k][j] += dp[i][j];
+ }
+
+ if (j+k < n) {
+ dp[i][j+k] += dp[i][j];
+ }
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(dp[n-1][n-1]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n][n];
+ dp = new long[n][n];
+
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_1932.java b/java/BOJ/Silver/I/S1_1932.java
new file mode 100644
index 0000000..307f6a1
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_1932.java
@@ -0,0 +1,91 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1932
+ *
+ * ? ์ ๋ชฉ: ์ ์ ์ผ๊ฐํ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * 7
+ * 3 8
+ * 8 1 0
+ * 2 7 4 4
+ * 4 5 2 6 5
+ * ์ ๊ทธ๋ฆผ์ ํฌ๊ธฐ๊ฐ 5์ธ ์ ์ ์ผ๊ฐํ์ ํ ๋ชจ์ต์ด๋ค.
+ *
+ * ๋งจ ์์ธต 7๋ถํฐ ์์ํด์ ์๋์ ์๋ ์ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ์๋์ธต์ผ๋ก ๋ด๋ ค์ฌ ๋, ์ด์ ๊น์ง ์ ํ๋ ์์ ํฉ์ด ์ต๋๊ฐ ๋๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ์๋์ธต์ ์๋ ์๋ ํ์ฌ ์ธต์์ ์ ํ๋ ์์ ๋๊ฐ์ ์ผ์ชฝ ๋๋ ๋๊ฐ์ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฒ ์ค์์๋ง ์ ํํ ์ ์๋ค.
+ * ์ผ๊ฐํ์ ํฌ๊ธฐ๋ 1 ์ด์ 500 ์ดํ์ด๋ค. ์ผ๊ฐํ์ ์ด๋ฃจ๊ณ ์๋ ๊ฐ ์๋ ๋ชจ๋ ์ ์์ด๋ฉฐ, ๋ฒ์๋ 0 ์ด์ 9999 ์ดํ์ด๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ผ๊ฐํ์ ํฌ๊ธฐ n(1 โค n โค 500)์ด ์ฃผ์ด์ง๊ณ , ๋์งธ ์ค๋ถํฐ n+1๋ฒ์งธ ์ค๊น์ง ์ ์ ์ผ๊ฐํ์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 5 -> n
+ * 7 -> arr[0][0]
+ * 3 8 -> arr[1][0] ~ arr[1][1]
+ * 8 1 0 -> arr[2][0] ~ arr[2][2]
+ * 2 7 4 4 -> arr[3][0] ~ arr[3][3]
+ * 4 5 2 6 5 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํฉ์ด ์ต๋๊ฐ ๋๋ ๊ฒฝ๋ก์ ์๋ ์์ ํฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 30
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 412ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 28MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class S1_1932 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[][] arr;
+
+ // # ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // 2. Top-Down ๋ฐฉ์ DP (Tabulation)
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j < i+1; j++) {
+ if (j == 0) {
+ arr[i][j] = arr[i-1][j] + arr[i][j];
+ } else {
+ arr[i][j] = Math.max(arr[i-1][j-1], arr[i-1][j]) + arr[i][j];
+ }
+ }
+ }
+
+ // 3. ์ ๋ต ์ถ๋ ฅ
+ int max = Arrays.stream(arr[n-1]).max().getAsInt();
+ System.out.println(max);
+ }
+
+ // # ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n][n];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 0; j < i+1; j++) {
+ arr[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_1946.java b/java/BOJ/Silver/I/S1_1946.java
new file mode 100644
index 0000000..3b3725c
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_1946.java
@@ -0,0 +1,92 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1946
+ *
+ * ? ์ ๋ชฉ: ์ ์
์ฌ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ธ์ ๋ ์ต๊ณ ๋ง์ ์งํฅํ๋ ๊ตด์ง์ ๋๊ธฐ์
์ง์ ์ฃผ์ํ์ฌ๊ฐ ์ ๊ท ์ฌ์ ์ฑ์ฉ์ ์ค์ํ๋ค. ์ธ์ฌ ์ ๋ฐ ์ํ์ 1์ฐจ ์๋ฅ์ฌ์ฌ์ 2์ฐจ ๋ฉด์ ์ํ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ต๊ณ ๋ง์ ์งํฅํ๋ค๋ ๊ธฐ์
์ ์ด๋
์ ๋ฐ๋ผ ๊ทธ๋ค์ ์ต๊ณ ์ ์ธ์ฌ๋ค๋ง์ ์ฌ์์ผ๋ก ์ ๋ฐํ๊ณ ์ถ์ด ํ๋ค.
+ * ๊ทธ๋์ ์ง์ ์ฃผ์ํ์ฌ๋, ๋ค๋ฅธ ๋ชจ๋ ์ง์์์ ๋น๊ตํ์ ๋ ์๋ฅ์ฌ์ฌ ์ฑ์ ๊ณผ ๋ฉด์ ์ํ ์ฑ์ ์ค ์ ์ด๋ ํ๋๊ฐ ๋ค๋ฅธ ์ง์์๋ณด๋ค ๋จ์ด์ง์ง ์๋ ์๋ง ์ ๋ฐํ๋ค๋ ์์น์ ์ธ์ ๋ค. ์ฆ, ์ด๋ค ์ง์์ A์ ์ฑ์ ์ด ๋ค๋ฅธ ์ด๋ค ์ง์์ B์ ์ฑ์ ์ ๋นํด ์๋ฅ ์ฌ์ฌ ๊ฒฐ๊ณผ์ ๋ฉด์ ์ฑ์ ์ด ๋ชจ๋ ๋จ์ด์ง๋ค๋ฉด A๋ ๊ฒฐ์ฝ ์ ๋ฐ๋์ง ์๋๋ค.
+ * ์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ฉด์, ์ง์ ์ฃผ์ํ์ฌ๊ฐ ์ด๋ฒ ์ ๊ท ์ฌ์ ์ฑ์ฉ์์ ์ ๋ฐํ ์ ์๋ ์ ์
์ฌ์์ ์ต๋ ์ธ์์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T(1 โค T โค 20)๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์ ์ง์์์ ์ซ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ๊ฐ๊ฐ์ ์ง์์์ ์๋ฅ์ฌ์ฌ ์ฑ์ , ๋ฉด์ ์ฑ์ ์ ์์๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ํ ์ค์ ์ฃผ์ด์ง๋ค. ๋ ์ฑ์ ์์๋ ๋ชจ๋ 1์๋ถํฐ N์๊น์ง ๋์์ฐจ ์์ด ๊ฒฐ์ ๋๋ค๊ณ ๊ฐ์ ํ๋ค.
+ *
+ * 2 -> t
+ * 5 -> n
+ * 3 2 -> arr[3] = 2
+ * 1 4 -> arr[1] = 4
+ * 4 1 ...
+ * 2 3
+ * 5 5 -> arr[5] = 5;
+ * 7 -> n
+ * 3 6 -> ...
+ * 7 3
+ * 4 2
+ * 1 4
+ * 5 7
+ * 2 5
+ * 6 1
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด์ ์ง์ ์ฃผ์ํ์ฌ๊ฐ ์ ๋ฐํ ์ ์๋ ์ ์
์ฌ์์ ์ต๋ ์ธ์์๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
+ *
+ * 4
+ * 3
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.828์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 295MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S1_1946 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n;
+ static int[] arr;
+
+ public static void main(String[] args) throws IOException {
+ StringBuffer sb = new StringBuffer();
+
+ int t = Integer.parseInt(br.readLine());
+ for (int i = 0; i < t; i++) {
+ input();
+
+ int bMax = arr[1];
+ int count = 1;
+ for (int j = 2; j <= n; j++) {
+ if (bMax > arr[j]) {
+ bMax = arr[j];
+ count++;
+ }
+ }
+
+ sb.append(count + "\n");
+ }
+
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n + 1];
+ for (int i = 0; i < n; i++) {
+ st = new StringTokenizer(br.readLine());
+ arr[Integer.parseInt(st.nextToken())] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_1992.java b/java/BOJ/Silver/I/S1_1992.java
new file mode 100644
index 0000000..6e2a1f8
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_1992.java
@@ -0,0 +1,101 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1992
+ *
+ * ? ์ ๋ชฉ: ์ฟผ๋ํธ๋ฆฌ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ํ๋ฐฑ ์์์ ์์ถํ์ฌ ํํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฟผ๋ ํธ๋ฆฌ(Quad Tree)๋ผ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ํฐ ์ ์ ๋ํ๋ด๋ 0๊ณผ ๊ฒ์ ์ ์ ๋ํ๋ด๋ 1๋ก๋ง ์ด๋ฃจ์ด์ง ์์(2์ฐจ์ ๋ฐฐ์ด)์์ ๊ฐ์ ์ซ์์ ์ ๋ค์ด ํ ๊ณณ์ ๋ง์ด ๋ชฐ๋ ค์์ผ๋ฉด, ์ฟผ๋ ํธ๋ฆฌ์์๋ ์ด๋ฅผ ์์ถํ์ฌ ๊ฐ๋จํ ํํํ ์ ์๋ค.
+ * ์ฃผ์ด์ง ์์์ด ๋ชจ๋ 0์ผ๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "0"์ด ๋๊ณ , ๋ชจ๋ 1๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "1"์ด ๋๋ค. ๋ง์ฝ 0๊ณผ 1์ด ์์ฌ ์์ผ๋ฉด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ํ๋ด์ง๋ฅผ ๋ชปํ๊ณ , ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋, ์ด๋ ๊ฒ 4๊ฐ์ ์์์ผ๋ก ๋๋์ด ์์ถํ๊ฒ ๋๋ฉฐ, ์ด 4๊ฐ์ ์์ญ์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋๋ก ๊ดํธ ์์ ๋ฌถ์ด์ ํํํ๋ค
+ * ์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ์ ์์์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ซ์๋ก ์ฃผ์ด์ง๋ฉฐ, ์ด ์์์ ์ฟผ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์์ถํ๋ฉด "(0(0011)(0(0111)01)1)"๋ก ํํ๋๋ค. N รN ํฌ๊ธฐ์ ์์์ด ์ฃผ์ด์ง ๋, ์ด ์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ซ์ N ์ด ์ฃผ์ด์ง๋ค. N ์ ์ธ์ ๋ 2์ ์ ๊ณฑ์๋ก ์ฃผ์ด์ง๋ฉฐ, 1 โค N โค 64์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ๋ ๊ธธ์ด N์ ๋ฌธ์์ด์ด N๊ฐ ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์์ด์ 0 ๋๋ 1์ ์ซ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์์์ ๊ฐ ์ ๋ค์ ๋ํ๋ธ๋ค.
+ *
+ * 8 -> n
+ * 11110000 -> arr[0][0] ~ arr[0][n-1]
+ * 11110000
+ * 00011100
+ * 00011100
+ * 11110000
+ * 11110000
+ * 11110011
+ * 11110011 -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * ((110(0101))(0010)1(0001))
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 84ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 13MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.I;
+
+import java.io.*;
+
+public class S1_1992 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ // * ํ์ฑ
+ static int n;
+ static char[][] arr;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ bw.write(zip(0, 0, n)); // * 2. ๋ถํ ์ ๋ณต
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! ๋ถํ ์ ๋ณต
+ public static String zip(int x, int y, int n) {
+ if (n == 1) {
+ return String.valueOf(arr[x][y]);
+ }
+
+ boolean isSame = true;
+ for (int i = x; i < x + n; i++) {
+ for (int j = y; j < y + n;j ++) {
+ if (arr[x][y] != arr[i][j]) {
+ isSame = false;
+ break;
+ }
+ }
+ }
+
+ if (isSame) {
+ return String.valueOf(arr[x][y]);
+ }
+
+ int side = n / 2;
+ StringBuilder sb = new StringBuilder();
+ sb.append("(" +
+ zip(x, y, side) +
+ zip(x, y+side, side) +
+ zip(x+side, y, side) +
+ zip(x+side, y+side, side) +
+ ")");
+
+ return sb.toString();
+ }
+
+ // ! ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new char[n][n];
+ for (int i = 0; i < n; i++) {
+ arr[i] = br.readLine().toCharArray();
+ }
+ }
+
+}
diff --git a/java/BOJ/Silver/I/S1_2156.java b/java/BOJ/Silver/I/S1_2156.java
new file mode 100644
index 0000000..360ecfb
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_2156.java
@@ -0,0 +1,88 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2156
+ *
+ * ? ์ ๋ชฉ: ํฌ๋์ฃผ ์์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ํจ์ฃผ๋ ํฌ๋์ฃผ ์์ํ์ ๊ฐ๋ค. ๊ทธ ๊ณณ์ ๊ฐ๋๋, ํ
์ด๋ธ ์์ ๋ค์ํ ํฌ๋์ฃผ๊ฐ ๋ค์ด์๋ ํฌ๋์ฃผ ์์ด ์ผ๋ ฌ๋ก ๋์ฌ ์์๋ค. ํจ์ฃผ๋ ํฌ๋์ฃผ ์์์ ํ๋ ค๊ณ ํ๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ๊ท์น์ด ์๋ค.
+ * ํฌ๋์ฃผ ์์ ์ ํํ๋ฉด ๊ทธ ์์ ๋ค์ด์๋ ํฌ๋์ฃผ๋ ๋ชจ๋ ๋ง์
์ผ ํ๊ณ , ๋ง์ ํ์๋ ์๋ ์์น์ ๋ค์ ๋์์ผ ํ๋ค.
+ * ์ฐ์์ผ๋ก ๋์ฌ ์๋ 3์์ ๋ชจ๋ ๋ง์ค ์๋ ์๋ค.
+ * ํจ์ฃผ๋ ๋ ์ ์๋ ๋๋ก ๋ง์ ์์ ํฌ๋์ฃผ๋ฅผ ๋ง๋ณด๊ธฐ ์ํด์ ์ด๋ค ํฌ๋์ฃผ ์์ ์ ํํด์ผ ํ ์ง ๊ณ ๋ฏผํ๊ณ ์๋ค. 1๋ถํฐ n๊น์ง์ ๋ฒํธ๊ฐ ๋ถ์ด ์๋ n๊ฐ์ ํฌ๋์ฃผ ์์ด ์์๋๋ก ํ
์ด๋ธ ์์ ๋์ฌ ์๊ณ , ๊ฐ ํฌ๋์ฃผ ์์ ๋ค์ด์๋ ํฌ๋์ฃผ์ ์์ด ์ฃผ์ด์ก์ ๋, ํจ์ฃผ๋ฅผ ๋์ ๊ฐ์ฅ ๋ง์ ์์ ํฌ๋์ฃผ๋ฅผ ๋ง์ค ์ ์๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * ์๋ฅผ ๋ค์ด 6๊ฐ์ ํฌ๋์ฃผ ์์ด ์๊ณ , ๊ฐ๊ฐ์ ์์ ์์๋๋ก 6, 10, 13, 9, 8, 1 ๋งํผ์ ํฌ๋์ฃผ๊ฐ ๋ค์ด ์์ ๋, ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ, ๋ค ๋ฒ์งธ, ๋ค์ฏ ๋ฒ์งธ ํฌ๋์ฃผ ์์ ์ ํํ๋ฉด ์ด ํฌ๋์ฃผ ์์ด 33์ผ๋ก ์ต๋๋ก ๋ง์ค ์ ์๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํฌ๋์ฃผ ์์ ๊ฐ์ n์ด ์ฃผ์ด์ง๋ค. (1 โค n โค 10,000) ๋์งธ ์ค๋ถํฐ n+1๋ฒ์งธ ์ค๊น์ง ํฌ๋์ฃผ ์์ ๋ค์ด์๋ ํฌ๋์ฃผ์ ์์ด ์์๋๋ก ์ฃผ์ด์ง๋ค. ํฌ๋์ฃผ์ ์์ 1,000 ์ดํ์ ์์ด ์๋ ์ ์์ด๋ค.
+ *
+ * 6 -> n
+ * 6 -> arr[1]
+ * 10
+ * 13
+ * 9
+ * 8
+ * 1 -> arr[n]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ต๋๋ก ๋ง์ค ์ ์๋ ํฌ๋์ฃผ์ ์์ ์ถ๋ ฅํ๋ค.
+ *
+ * 33
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 96ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 13MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Silver.I;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S1_2156 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] dp;
+
+ // # ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // ๊ธธ์ด๊ฐ 1์ธ ๊ฒฝ์ฐ(์์ธ ์ผ์ด์ค)
+ if (n == 1) {
+ System.out.println(arr[1]);
+ return;
+ }
+
+ // * 2. DP(Tabulation)
+ dp[1] = arr[1];
+ dp[2] = arr[1] + arr[2];
+ for (int i = 3; i <= n; i++) {
+ dp[i] = Math.max(dp[i - 1],
+ Math.max(dp[i - 2] + arr[i],
+ dp[i - 3] + arr[i - 1] + arr[i]));
+ }
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(dp[n]);
+ }
+
+ // # ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n+1];
+ dp = new int[n+1];
+
+ for (int i = 1; i <= n; i++) {
+ arr[i] = Integer.parseInt(br.readLine());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/I/S1_9465.java b/java/BOJ/Silver/I/S1_9465.java
new file mode 100644
index 0000000..418b2c9
--- /dev/null
+++ b/java/BOJ/Silver/I/S1_9465.java
@@ -0,0 +1,106 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9465
+ *
+ * ? ์ ๋ชฉ: ์คํฐ์ปค
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์๊ทผ์ด์ ์ฌ๋์ ์๋ฅ์ด๋ ๋ฌธ๋ฐฉ๊ตฌ์์ ์คํฐ์ปค 2n๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ค. ์คํฐ์ปค๋ ๊ทธ๋ฆผ (a)์ ๊ฐ์ด 2ํ n์ด๋ก ๋ฐฐ์น๋์ด ์๋ค. ์๋ฅ์ด๋ ์คํฐ์ปค๋ฅผ ์ด์ฉํด ์ฑ
์์ ๊พธ๋ฏธ๋ ค๊ณ ํ๋ค.
+ * ์๋ฅ์ด๊ฐ ๊ตฌ๋งคํ ์คํฐ์ปค์ ํ์ง์ ๋งค์ฐ ์ข์ง ์๋ค. ์คํฐ์ปค ํ ์ฅ์ ๋ผ๋ฉด, ๊ทธ ์คํฐ์ปค์ ๋ณ์ ๊ณต์ ํ๋ ์คํฐ์ปค๋ ๋ชจ๋ ์ฐข์ด์ ธ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์ฆ, ๋ ์คํฐ์ปค์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์, ์๋์ ์๋ ์คํฐ์ปค๋ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
+ * ๋ชจ๋ ์คํฐ์ปค๋ฅผ ๋ถ์ผ ์ ์๊ฒ๋ ์๋ฅ์ด๋ ๊ฐ ์คํฐ์ปค์ ์ ์๋ฅผ ๋งค๊ธฐ๊ณ , ์ ์์ ํฉ์ด ์ต๋๊ฐ ๋๊ฒ ์คํฐ์ปค๋ฅผ ๋ผ์ด๋ด๋ ค๊ณ ํ๋ค. ๋จผ์ , ๊ทธ๋ฆผ (b)์ ๊ฐ์ด ๊ฐ ์คํฐ์ปค์ ์ ์๋ฅผ ๋งค๊ฒผ๋ค. ์๋ฅ์ด๊ฐ ๋ ์ ์๋ ์คํฐ์ปค์ ์ ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ฆ, 2n๊ฐ์ ์คํฐ์ปค ์ค์์ ์ ์์ ํฉ์ด ์ต๋๊ฐ ๋๋ฉด์ ์๋ก ๋ณ์ ๊ณต์ ํ์ง ์๋ ์คํฐ์ปค ์งํฉ์ ๊ตฌํด์ผ ํ๋ค.
+ * ์์ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ์ ์ ์๊ฐ 50, 50, 100, 60์ธ ์คํฐ์ปค๋ฅผ ๊ณ ๋ฅด๋ฉด, ์ ์๋ 260์ด ๋๊ณ ์ด ๊ฒ์ด ์ต๋ ์ ์์ด๋ค. ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ฐ์ง๋ ๋ ์คํฐ์ปค (100๊ณผ 70)์ ๋ณ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ๋์์ ๋ ์ ์๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ n (1 โค n โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ๋ ์ค์๋ n๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ ์๋ ๊ทธ ์์น์ ํด๋นํ๋ ์คํฐ์ปค์ ์ ์์ด๋ค. ์ฐ์ํ๋ ๋ ์ ์ ์ฌ์ด์๋ ๋น ์นธ์ด ํ๋ ์๋ค. ์ ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
+ *
+ * 2 -> t
+ * 5 -> n
+ * 50 10 100 20 40 -> sticker[0][1] ~ sticker[0][n]
+ * 30 50 70 10 60 -> sticker[1][1] ~ sticker[1][n]
+ * 7 -> n
+ * 10 30 10 50 100 20 40 -> sticker[0][1] ~ sticker[0][n]
+ * 20 40 30 50 60 20 80 -> sticker[1][1] ~ sticker[1][n]
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค ๋ง๋ค, 2n๊ฐ์ ์คํฐ์ปค ์ค์์ ๋ ๋ณ์ ๊ณต์ ํ์ง ์๋ ์คํฐ์ปค ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 260
+ * 290
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 600ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 125MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Silver.I;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S1_9465 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] sticker;
+
+ public static void main(String[] args) throws IOException {
+ int t = Integer.parseInt(br.readLine()); // test case ๊ฐ์
+ StringBuffer sb = new StringBuffer(); // ์ถ๋ ฅ๋ฌธ
+
+ // * 0. t๋ฒ๋์
+ for (int i = 0; i < t; i++) {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ if (n == 1) { // * n์ด 1์ธ ๊ฒฝ์ฐ ์คํฐ์ปค ๋๊ฐ ์ค max๊ฐ ์ถ๊ฐ
+ sb.append(Math.max(sticker[0][1], sticker[1][1]) + "\n");
+ } else { // * n์ด 1์ด ์๋ ๊ฒฝ์ฐ DP(Tabulation: Bottom-Up) ์คํ
+ sb.append(dp() + "\n");
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+
+ // ! DP(Tabulation: Bottom-Up)
+ public static int dp() {
+ int[][] table = new int[2][n+1];
+ for (int i = 0; i < 2; i++) {
+ table[i] = sticker[i].clone();
+ }
+
+
+ for (int j = 2; j <= n; j++) {
+ for (int i = 0; i < 2; i++) {
+ table[i][j] = Math.max(table[i][j],
+ Math.max(table[i^1][j-1], table[i^1][j-2]) + sticker[i][j]);
+ }
+ }
+
+ return Math.max(table[0][n], table[1][n]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ sticker = new int[2][n+1];
+ for (int i = 0; i < 2; i++) {
+ st = new StringTokenizer(br.readLine());
+ for (int j = 1; j <= n; j++) {
+ sticker[i][j] = Integer.parseInt(st.nextToken());
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Silver/II/S2_1058.java b/java/BOJ/Silver/II/S2_1058.java
new file mode 100644
index 0000000..c0a8281
--- /dev/null
+++ b/java/BOJ/Silver/II/S2_1058.java
@@ -0,0 +1,99 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1058
+ *
+ * ? ์ ๋ชฉ: ์น๊ตฌ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ง๋ฏผ์ด๋ ์ธ๊ณ์์ ๊ฐ์ฅ ์ ๋ช
ํ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ๊ถ๊ธํด์ก๋ค. ๊ฐ์ฅ ์ ๋ช
ํ ์ฌ๋์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๊ฐ ์ฌ๋์ 2-์น๊ตฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ค. ์ด๋ค ์ฌ๋ A๊ฐ ๋๋ค๋ฅธ ์ฌ๋ B์ 2-์น๊ตฌ๊ฐ ๋๊ธฐ ์ํด์ , ๋ ์ฌ๋์ด ์น๊ตฌ์ด๊ฑฐ๋, A์ ์น๊ตฌ์ด๊ณ , B์ ์น๊ตฌ์ธ C๊ฐ ์กด์ฌํด์ผ ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ์ฅ ์ ๋ช
ํ ์ฌ๋์ 2-์น๊ตฌ์ ์๊ฐ ๊ฐ์ฅ ๋ง์ ์ฌ๋์ด๋ค. ๊ฐ์ฅ ์ ๋ช
ํ ์ฌ๋์ 2-์น๊ตฌ์ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ * A์ B๊ฐ ์น๊ตฌ๋ฉด, B์ A๋ ์น๊ตฌ์ด๊ณ , A์ A๋ ์น๊ตฌ๊ฐ ์๋๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ฌ๋์ ์ N์ด ์ฃผ์ด์ง๋ค. N์ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ์ฌ๋์ด ์น๊ตฌ์ด๋ฉด Y, ์๋๋ฉด N์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 3 -> n
+ * NYY -> N : 0, Y : 1 ๋ก ์นํ ๋์
, arr[0][0] ~ arr[0][n-1]
+ * YNY
+ * YYN -> arr[n-1][0] ~ arr[n-1][n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ฐ์ฅ ์ ๋ช
ํ ์ฌ๋์ 2-์น๊ตฌ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.084์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class S2_1058 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static int n;
+ static int[][] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max = 0;
+ static boolean[] visited;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. BFS
+ for (int i = 0; i < n; i++) {
+ visited = new boolean[n];
+ Queue queue = new LinkedList<>();
+ queue.add(new int[] {i, 0});
+ visited[i] = true;
+ int count = 0;
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[1] == 2) {
+ break;
+ }
+
+ for (int j = 0; j < n; j++) {
+ if (arr[cur[0]][j] == 1 && !visited[j]) {
+ visited[j] = true;
+ queue.add(new int[] {j, cur[1] + 1});
+ count++;
+ }
+ }
+ }
+
+ if (count > max) {
+ max = count;
+ }
+ }
+
+ // * 3. ์ถ๋ ฅ
+ System.out.println(max);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ arr = new int[n][n];
+
+ for (int i = 0; i < n; i++) {
+ char[] c = br.readLine().toCharArray();
+ for (int j = 0; j < n; j++) {
+ arr[i][j] = (c[j] == 'Y') ? 1 : 0;
+ }
+ }
+ }
+}
diff --git a/java/BOJ/Silver/II/S2_1541.java b/java/BOJ/Silver/II/S2_1541.java
new file mode 100644
index 0000000..4493935
--- /dev/null
+++ b/java/BOJ/Silver/II/S2_1541.java
@@ -0,0 +1,59 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1541
+ *
+ * ? ์ ๋ชฉ: ์์ด๋ฒ๋ฆฐ ๊ดํธ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ธ์ค์ด๋ ์์์ +, -, ๊ทธ๋ฆฌ๊ณ ๊ดํธ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ์ธ์ค์ด๋ ๊ดํธ๋ฅผ ๋ชจ๋ ์ง์ ๋ค.
+ * ๊ทธ๋ฆฌ๊ณ ๋์ ์ธ์ค์ด๋ ๊ดํธ๋ฅผ ์ ์ ํ ์ณ์ ์ด ์์ ๊ฐ์ ์ต์๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค.
+ * ๊ดํธ๋ฅผ ์ ์ ํ ์ณ์ ์ด ์์ ๊ฐ์ ์ต์๋ก ๋ง๋๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์์ด ์ฃผ์ด์ง๋ค. ์์ โ0โ~โ9โ, โ+โ, ๊ทธ๋ฆฌ๊ณ โ-โ๋ง์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ฐ์ฅ ์ฒ์๊ณผ ๋ง์ง๋ง ๋ฌธ์๋ ์ซ์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ํด์ ๋ ๊ฐ ์ด์์ ์ฐ์ฐ์๊ฐ ๋ํ๋์ง ์๊ณ , 5์๋ฆฌ๋ณด๋ค ๋ง์ด ์ฐ์๋๋ ์ซ์๋ ์๋ค. ์๋ 0์ผ๋ก ์์ํ ์ ์๋ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์์ ๊ธธ์ด๋ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+ *
+ * 55-50+40 -> str
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค.
+ *
+ * 35
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.088์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S2_1541 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ String str = br.readLine();
+ String[] substracts = str.split("-");
+ int total = 0;
+ for (int i = 0; i < substracts.length; i++) {
+ String[] sums = substracts[i].split("\\+");
+ int sum = 0;
+ for (String s : sums) {
+ sum += Integer.parseInt(s);
+ }
+
+ if (i == 0) {
+ total += sum;
+ } else {
+ total -= sum;
+ }
+ }
+
+ System.out.println(total);
+ }
+}
diff --git a/java/BOJ/Silver/II/S2_15988.java b/java/BOJ/Silver/II/S2_15988.java
new file mode 100644
index 0000000..6b3fcc2
--- /dev/null
+++ b/java/BOJ/Silver/II/S2_15988.java
@@ -0,0 +1,80 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/15988
+ *
+ * ? ์ ๋ชฉ: 1, 2, 3 ๋ํ๊ธฐ 3
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ ์ 4๋ฅผ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ด 7๊ฐ์ง๊ฐ ์๋ค. ํฉ์ ๋ํ๋ผ ๋๋ ์๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
+ * 1+1+1+1
+ * 1+1+2
+ * 1+2+1
+ * 2+1+1
+ * 2+2
+ * 1+3
+ * 3+1
+ * ์ ์ n์ด ์ฃผ์ด์ก์ ๋, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ n์ด ์ฃผ์ด์ง๋ค. n์ ์์์ด๋ฉฐ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+ *
+ * 3 -> t
+ * 4 -> num
+ * 7 -> num
+ * 10 -> num
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ 1,000,000,009๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 7
+ * 44
+ * 274
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.124์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Silver.II;
+
+import java.io.*;
+
+public class S2_15988 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+ public static void main(String[] args) throws IOException {
+ // * ์ด๊ธฐ ์ค์
+ int[] dp = new int[1_000_001];
+ StringBuffer sb = new StringBuffer();
+ int div = 1_000_000_009;
+
+ // * Start Case
+ dp[0] = 0;
+ dp[1] = 1;
+ dp[2] = 2;
+ dp[3] = 4;
+
+ // * 1. DP(Tabulation: Bottom-Up)
+ for (int i = 4; i < dp.length; i++) {
+ dp[i] = ((dp[i-1] % div + dp[i-2] % div) % div + dp[i-3] % div) % div;
+ }
+
+ // * 2. ์
๋ ฅ ๋ฐ๊ธฐ
+ int t = Integer.parseInt(br.readLine());
+ for (int i = 0; i < t; i++) {
+ int num = Integer.parseInt(br.readLine());
+ sb.append(dp[num] + "\n");
+ }
+
+ // * 3. ์ถ๋ ฅ
+ bw.write(sb.toString());
+
+ br.close();
+ bw.flush();
+ bw.close();
+ }
+}
diff --git a/java/BOJ/Silver/II/S2_1912.java b/java/BOJ/Silver/II/S2_1912.java
new file mode 100644
index 0000000..89ec257
--- /dev/null
+++ b/java/BOJ/Silver/II/S2_1912.java
@@ -0,0 +1,78 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1912
+ *
+ * ? ์ ๋ชฉ: ์ฐ์ํฉ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * n๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์์ ์์ด์ด ์ฃผ์ด์ง๋ค. ์ฐ๋ฆฌ๋ ์ด ์ค ์ฐ์๋ ๋ช ๊ฐ์ ์๋ฅผ ์ ํํด์ ๊ตฌํ ์ ์๋ ํฉ ์ค ๊ฐ์ฅ ํฐ ํฉ์ ๊ตฌํ๋ ค๊ณ ํ๋ค. ๋จ, ์๋ ํ ๊ฐ ์ด์ ์ ํํด์ผ ํ๋ค.
+ * ์๋ฅผ ๋ค์ด์ 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 ์ด๋ผ๋ ์์ด์ด ์ฃผ์ด์ก๋ค๊ณ ํ์. ์ฌ๊ธฐ์ ์ ๋ต์ 12+21์ธ 33์ด ์ ๋ต์ด ๋๋ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ์ ์ n(1 โค n โค 100,000)์ด ์ฃผ์ด์ง๊ณ ๋์งธ ์ค์๋ n๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์ฃผ์ด์ง๋ค. ์๋ -1,000๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
+ *
+ * 10 -> n
+ * 10 -4 3 1 5 6 -35 12 21 -1 -> arr[0] ~ arr[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ต์ ์ถ๋ ฅํ๋ค.
+ *
+ * 33
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 220ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 22MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class S2_1912 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+ static int[] arr;
+
+ // * ์ด๊ธฐ ์ค์
+ static int max; // ์ฐ์ํฉ ์ต๋๊ฐ
+ static int[] dp; // ์ฐ์ํฉ ์ต๋๊ฐ DP
+
+ // # ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ max = arr[0]; // ์ต๋๊ฐ ์ด๊ธฐํ
+ dp[0] = arr[0]; // ์์๊ฐ ์ด๊ธฐํ
+
+ // * 2. DP(Tabulation)
+ for (int i = 1; i < n; i++) {
+ dp[i] = Math.max(arr[i] + dp[i-1], arr[i]);
+ max = Math.max(max, dp[i]);
+ }
+
+ // * 3. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(max);
+ }
+
+ // # ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n];
+ dp = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/II/S2_1965.java b/java/BOJ/Silver/II/S2_1965.java
new file mode 100644
index 0000000..fa5d649
--- /dev/null
+++ b/java/BOJ/Silver/II/S2_1965.java
@@ -0,0 +1,94 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1965
+ *
+ * ? ์์๋ฃ๊ธฐ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ ์ก๋ฉด์ฒด ๋ชจ์์ ์์๊ฐ ์ผ๋ ฌ๋ก ๋์ด์ ์๋ค. ์์๋ง๋ค ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ ธ ์๋๋ฐ, ์์ ์๋ ์์์ ํฌ๊ธฐ๊ฐ ๋ค์ ์๋ ์์์ ํฌ๊ธฐ๋ณด๋ค ์์ผ๋ฉด, ์์ ์๋ ์์๋ฅผ ๋ค์ ์๋ ์์ ์์ ๋ฃ์ ์๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด ์์์๋ถํฐ ์์๋๋ก ํฌ๊ธฐ๊ฐ (1, 5, 2, 3, 7)์ธ 5๊ฐ์ ์์๊ฐ ์๋ค๋ฉด, ํฌ๊ธฐ 1์ธ ์์๋ฅผ ํฌ๊ธฐ 5์ธ ์์์ ๋ฃ๊ณ , ๋ค์ ์ด ์์๋ฅผ ํฌ๊ธฐ 7์ธ ์์ ์์ ๋ฃ์ ์ ์๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์์๋ฅผ ๋ฃ์ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์๋ค. ์์ ์์์ ์ฐจ๋ก๋๋ก ํฌ๊ธฐ๊ฐ 1, 2, 3, 7์ธ ์์๋ฅผ ์ ํํ๋ฉด ์ด 4๊ฐ์ ์์๊ฐ ํ ๊ฐ์ ์์์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
+ * ์์์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง ๋, ํ ๋ฒ์ ๋ฃ์ ์ ์๋ ์ต๋์ ์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ํ์ผ์ ์ฒซ ๋ฒ์งธ ์ค์ ์์์ ๊ฐ์ n (1 โค n โค 1000)์ ๋ํ๋ธ๋ค. ๋ ๋ฒ์งธ ์ค์๋ ๊ฐ ์์์ ํฌ๊ธฐ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์์์ ํฌ๊ธฐ๋ 1,000์ ๋์ง ์๋ ์์ฐ์์ด๋ค.
+ *
+ * 8
+ * 1 6 2 5 7 3 5 6
+ *
+ * ? ์ถ๋ ฅ
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.08์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.II;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class S2_1965 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ & ์ด๊ธฐ ์ค์
+ static int n;
+ static int[] arr, dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. Start Case ์ค์
+ dp[0] = arr[0];
+ int p = 1;
+
+ // * 3. LIS(DP: Tabulation)
+ for (int i = 0; i < n; i++) {
+ if (dp[p-1] < arr[i]) {
+ dp[p++] = arr[i];
+ } else {
+ int left = 0;
+ int right = p-1;
+
+ while (left <= right) {
+ int mid = (left + right) / 2;
+
+ if (dp[mid] == arr[i]) {
+ left = mid;
+ break;
+ }
+
+ if (dp[mid] > arr[i]) {
+ right = mid-1;
+ } else {
+ left = mid+1;
+ }
+ }
+
+ dp[left] = arr[i];
+ }
+ }
+
+ // * 4. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(p);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ arr = new int[n];
+ dp = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ arr[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/III/S3_11051.java b/java/BOJ/Silver/III/S3_11051.java
new file mode 100644
index 0000000..8afc7bd
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_11051.java
@@ -0,0 +1,69 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11051
+ *
+ * ? ์ ๋ชฉ: ์ดํญ ๊ณ์ 2
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์์ฐ์ \(N\)๊ณผ ์ ์ \(K\)๊ฐ ์ฃผ์ด์ก์ ๋ ์ดํญ ๊ณ์
+ * \(\binom{N}{K}\)๋ฅผ 10,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ \(N\)๊ณผ \(K\)๊ฐ ์ฃผ์ด์ง๋ค. (1 โค \(N\) โค 1,000, 0 โค \(K\) โค \(N\))
+ *
+ * 5 2 -> n k
+ *
+ * ? ์ถ๋ ฅ
+ * ( N )
+ * ( K )
+ * ๋ฅผ 10,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 10
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 96ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+public class S3_11051 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ st = new StringTokenizer(br.readLine());
+ int n = Integer.parseInt(st.nextToken());
+ int k = Integer.parseInt(st.nextToken());
+
+ // * ์ด๊ธฐ ์ค์
+ int div = 10_007;
+
+ // * 2. DP Table ์ด๊ธฐํ, Start Case ์ค์
+ int[][] dp = new int[n+1][n+1];
+ dp[0][0] = 1;
+
+ // * 3. DP(Tabulation: Bottom-Up) - ํ์ค์นผ์ ์ผ๊ฐํ(์ดํญ๊ณ์)
+ for (int i = 1; i <= n; i++) {
+ for (int j = 0; j <= i; j++) {
+ if (j == 0 || j == n) {
+ dp[i][j] = 1;
+ } else {
+ dp[i][j] = (dp[i-1][j-1] % div + dp[i-1][j] % div) % div;
+ }
+ }
+ }
+
+ // * 4. ์ ๋ต ์ถ๋ ฅ
+ System.out.println(dp[n][k]);
+ }
+}
diff --git a/java/BOJ/Silver/III/S3_11727.java b/java/BOJ/Silver/III/S3_11727.java
new file mode 100644
index 0000000..b6f8493
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_11727.java
@@ -0,0 +1,69 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11727
+ *
+ * ? ์ ๋ชฉ: 2xn ํ์ผ๋ง 2
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * 2รn ์ง์ฌ๊ฐํ์ 1ร2, 2ร1๊ณผ 2ร2 ํ์ผ๋ก ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ n์ด ์ฃผ์ด์ง๋ค. (1 โค n โค 1,000)
+ *
+ * 12 -> n
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ 2รn ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ 10,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2731
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 76ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S3_11727 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static int n;
+
+ // * ์ด๊ธฐ ์ค์
+ static int div = 10_007;
+ static int[] dp;
+
+ // ! ๋ฉ์ธ ํจ์
+ public static void main(String[] args) throws IOException {
+ // * 1 ์
๋ ฅ ๋ฐ๊ธฐ
+ n = Integer.parseInt(br.readLine());
+ dp = new int[n+1];
+
+ // * 2. DP(tabulation) + 3. ์ถ๋ ฅ
+ System.out.println(tile());
+ }
+
+ // ! DP(tabulation)
+ public static int tile() {
+ if (n == 1) {
+ return 1;
+ }
+
+ dp[1] = 1;
+ dp[2] = 3;
+
+ for (int i = 3; i <= n; i++) {
+ dp[i] = ((dp[i-2] % div + dp[i-2] % div) % div + dp[i-1] % div) % div;
+ }
+
+ return dp[n];
+ }
+}
diff --git a/java/BOJ/Silver/III/S3_13305.java b/java/BOJ/Silver/III/S3_13305.java
new file mode 100644
index 0000000..fc5a148
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_13305.java
@@ -0,0 +1,84 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/13305
+ *
+ * ? ์ ๋ชฉ: ์ฃผ์ ์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์ด๋ค ๋๋ผ์ N๊ฐ์ ๋์๊ฐ ์๋ค. ์ด ๋์๋ค์ ์ผ์ง์ ๋๋ก ์์ ์๋ค. ํธ์์ ์ผ์ง์ ์ ์ํ ๋ฐฉํฅ์ผ๋ก ๋์. ์ ์ผ ์ผ์ชฝ์ ๋์์์ ์ ์ผ ์ค๋ฅธ์ชฝ์ ๋์๋ก ์๋์ฐจ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ํ๋ ค๊ณ ํ๋ค. ์ธ์ ํ ๋ ๋์ ์ฌ์ด์ ๋๋ก๋ค์ ์๋ก ๊ธธ์ด๊ฐ ๋ค๋ฅผ ์ ์๋ค. ๋๋ก ๊ธธ์ด์ ๋จ์๋ km๋ฅผ ์ฌ์ฉํ๋ค.
+ * ์ฒ์ ์ถ๋ฐํ ๋ ์๋์ฐจ์๋ ๊ธฐ๋ฆ์ด ์์ด์ ์ฃผ์ ์์์ ๊ธฐ๋ฆ์ ๋ฃ๊ณ ์ถ๋ฐํ์ฌ์ผ ํ๋ค. ๊ธฐ๋ฆํต์ ํฌ๊ธฐ๋ ๋ฌด์ ํ์ด์ด์ ์ผ๋ง๋ ์ง ๋ง์ ๊ธฐ๋ฆ์ ๋ฃ์ ์ ์๋ค. ๋๋ก๋ฅผ ์ด์ฉํ์ฌ ์ด๋ํ ๋ 1km๋ง๋ค 1๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ์ฌ์ฉํ๋ค. ๊ฐ ๋์์๋ ๋จ ํ๋์ ์ฃผ์ ์๊ฐ ์์ผ๋ฉฐ, ๋์ ๋ง๋ค ์ฃผ์ ์์ ๋ฆฌํฐ๋น ๊ฐ๊ฒฉ์ ๋ค๋ฅผ ์ ์๋ค. ๊ฐ๊ฒฉ์ ๋จ์๋ ์์ ์ฌ์ฉํ๋ค.
+ * ์๋ฅผ ๋ค์ด, ์ด ๋๋ผ์ ๋ค์ ๊ทธ๋ฆผ์ฒ๋ผ 4๊ฐ์ ๋์๊ฐ ์๋ค๊ณ ํ์. ์ ์์ ์๋ ์ซ์๋ ๊ทธ ๋์์ ์๋ ์ฃผ์ ์์ ๋ฆฌํฐ๋น ๊ฐ๊ฒฉ์ด๋ค. ๋๋ก ์์ ์๋ ์ซ์๋ ๋๋ก์ ๊ธธ์ด๋ฅผ ํ์ํ ๊ฒ์ด๋ค.
+ * ์ ์ผ ์ผ์ชฝ ๋์์์ 6๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ๋ฃ๊ณ , ๋ ์ด์์ ์ฃผ์ ์์ด ์ ์ผ ์ค๋ฅธ์ชฝ ๋์๊น์ง ์ด๋ํ๋ฉด ์ด ๋น์ฉ์ 30์์ด๋ค. ๋ง์ฝ ์ ์ผ ์ผ์ชฝ ๋์์์ 2๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ๋ฃ๊ณ (2ร5 = 10์) ๋ค์ ๋ฒ ๋์๊น์ง ์ด๋ํ ํ 3๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ๋ฃ๊ณ (3ร2 = 6์) ๋ค์ ๋์์์ 1๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ๋ฃ์ด(1ร4 = 4์) ์ ์ผ ์ค๋ฅธ์ชฝ ๋์๋ก ์ด๋ํ๋ฉด, ์ด ๋น์ฉ์ 20์์ด๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ผ ์ผ์ชฝ ๋์์์ 2๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ๋ฃ๊ณ (2ร5 = 10์) ๋ค์ ๋ฒ ๋์๊น์ง ์ด๋ํ ํ 4๋ฆฌํฐ์ ๊ธฐ๋ฆ์ ๋ฃ๊ณ (4ร2 = 8์) ์ ์ผ ์ค๋ฅธ์ชฝ ๋์๊น์ง ์ด๋ํ๋ฉด, ์ด ๋น์ฉ์ 18์์ด๋ค.
+ * ๊ฐ ๋์์ ์๋ ์ฃผ์ ์์ ๊ธฐ๋ฆ ๊ฐ๊ฒฉ๊ณผ, ๊ฐ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๊ธธ์ด๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ์ ์ผ ์ผ์ชฝ ๋์์์ ์ ์ผ ์ค๋ฅธ์ชฝ ๋์๋ก ์ด๋ํ๋ ์ต์์ ๋น์ฉ์ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ํ์ค ์
๋ ฅ์ผ๋ก ๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ์ฒซ ๋ฒ์งธ ์ค์๋ ๋์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ N(2 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ ์ธ์ ํ ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๊ธธ์ด๊ฐ ์ ์ผ ์ผ์ชฝ ๋๋ก๋ถํฐ N-1๊ฐ์ ์์ฐ์๋ก ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ ์ฃผ์ ์์ ๋ฆฌํฐ๋น ๊ฐ๊ฒฉ์ด ์ ์ผ ์ผ์ชฝ ๋์๋ถํฐ ์์๋๋ก N๊ฐ์ ์์ฐ์๋ก ์ฃผ์ด์ง๋ค. ์ ์ผ ์ผ์ชฝ ๋์๋ถํฐ ์ ์ผ ์ค๋ฅธ์ชฝ ๋์๊น์ง์ ๊ฑฐ๋ฆฌ๋ 1์ด์ 1,000,000,000 ์ดํ์ ์์ฐ์์ด๋ค. ๋ฆฌํฐ๋น ๊ฐ๊ฒฉ์ 1 ์ด์ 1,000,000,000 ์ดํ์ ์์ฐ์์ด๋ค.
+ *
+ * 4 -> n
+ * 2 3 1 -> len[1] ~ len[n-1]
+ * 5 2 4 1 -> gas[0] ~ gas[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ํ์ค ์ถ๋ ฅ์ผ๋ก ์ ์ผ ์ผ์ชฝ ๋์์์ ์ ์ผ ์ค๋ฅธ์ชฝ ๋์๋ก ๊ฐ๋ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.38์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 40MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Silver.III;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S3_13305 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ static int n;
+ static int[] len;
+ static int[] gas;
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ long cost = 0;
+ int cur = 0;
+
+ while (cur < n-1) {
+ int canGo = 0;
+ int next = cur;
+ for (int i = cur+1; i < n; i++) {
+ canGo += len[i];
+ next = i;
+ if (gas[cur] > gas[i]) {
+ break;
+ }
+ }
+
+ cost += (long) gas[cur] * canGo;
+ cur = next;
+ }
+
+ System.out.println(cost);
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+ len = new int[n];
+ gas = new int[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 1; i < n; i++) {
+ len[i] = Integer.parseInt(st.nextToken());
+ }
+
+ st = new StringTokenizer(br.readLine());
+ for (int i = 0; i < n; i++) {
+ gas[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/III/S3_14501.java b/java/BOJ/Silver/III/S3_14501.java
new file mode 100644
index 0000000..c9fce80
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_14501.java
@@ -0,0 +1,116 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/14501
+ *
+ * ? ์ ๋ชฉ: ํด์ฌ
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 512MB
+ *
+ * ? ๋ฌธ์
+ * ์๋ด์์ผ๋ก ์ผํ๊ณ ์๋ ๋ฐฑ์ค์ด๋ ํด์ฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค.
+ * ์ค๋๋ถํฐ N+1์ผ์งธ ๋๋ ๋ ํด์ฌ๋ฅผ ํ๊ธฐ ์ํด์, ๋จ์ N์ผ ๋์ ์ต๋ํ ๋ง์ ์๋ด์ ํ๋ ค๊ณ ํ๋ค.
+ * ๋ฐฑ์ค์ด๋ ๋น์์๊ฒ ์ต๋ํ ๋ง์ ์๋ด์ ์ก์ผ๋ผ๊ณ ๋ถํ์ ํ๊ณ , ๋น์๋ ํ๋ฃจ์ ํ๋์ฉ ์๋ก ๋ค๋ฅธ ์ฌ๋์ ์๋ด์ ์ก์๋์๋ค.
+ * ๊ฐ๊ฐ์ ์๋ด์ ์๋ด์ ์๋ฃํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ๊ธฐ๊ฐ Ti์ ์๋ด์ ํ์ ๋ ๋ฐ์ ์ ์๋ ๊ธ์ก Pi๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+ *
+ * N = 7์ธ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๋ด ์ผ์ ํ๋ฅผ ๋ณด์.
+ *
+ * 1์ผ 2์ผ 3์ผ 4์ผ 5์ผ 6์ผ 7์ผ
+ * Ti 3 5 1 1 2 4 2
+ * Pi 10 20 10 20 15 40 200
+ * 1์ผ์ ์กํ์๋ ์๋ด์ ์ด 3์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ์๋ดํ์ ๋ ๋ฐ์ ์ ์๋ ๊ธ์ก์ 10์ด๋ค. 5์ผ์ ์กํ์๋ ์๋ด์ ์ด 2์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ฐ์ ์ ์๋ ๊ธ์ก์ 15์ด๋ค.
+ * ์๋ด์ ํ๋๋ฐ ํ์ํ ๊ธฐ๊ฐ์ 1์ผ๋ณด๋ค ํด ์ ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์๋ด์ ํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด์ 1์ผ์ ์๋ด์ ํ๊ฒ ๋๋ฉด, 2์ผ, 3์ผ์ ์๋ ์๋ด์ ํ ์ ์๊ฒ ๋๋ค. 2์ผ์ ์๋ ์๋ด์ ํ๊ฒ ๋๋ฉด, 3, 4, 5, 6์ผ์ ์กํ์๋ ์๋ด์ ํ ์ ์๋ค.
+ * ๋ํ, N+1์ผ์งธ์๋ ํ์ฌ์ ์๊ธฐ ๋๋ฌธ์, 6, 7์ผ์ ์๋ ์๋ด์ ํ ์ ์๋ค.
+ * ํด์ฌ ์ ์ ํ ์ ์๋ ์๋ด์ ์ต๋ ์ด์ต์ 1์ผ, 4์ผ, 5์ผ์ ์๋ ์๋ด์ ํ๋ ๊ฒ์ด๋ฉฐ, ์ด๋์ ์ด์ต์ 10+20+15=45์ด๋ค.
+ * ์๋ด์ ์ ์ ํ ํ์ ๋, ๋ฐฑ์ค์ด๊ฐ ์ป์ ์ ์๋ ์ต๋ ์์ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ N (1 โค N โค 15)์ด ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ Ti์ Pi๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด์ ์ฃผ์ด์ง๋ฉฐ, 1์ผ๋ถํฐ N์ผ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. (1 โค Ti โค 5, 1 โค Pi โค 1,000)
+ *
+ * 7 -> n
+ * 3 10 -> time[1], price[1]
+ * 5 20
+ * 1 10
+ * 1 20
+ * 2 15
+ * 4 40
+ * 2 200 -> time[n], price[n]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ฐฑ์ค์ด๊ฐ ์ป์ ์ ์๋ ์ต๋ ์ด์ต์ ์ถ๋ ฅํ๋ค.
+ *
+ * 45
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 76ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Silver.III;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+public class S3_14501 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int n;
+
+ // * ์ด๊ธฐ ์ค์
+ static int[] time;
+ static int[] price;
+ static int[] dp;
+
+ public static void main(String[] args) throws IOException {
+ input(); // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+
+ // * 2. DP(Tabulation)
+ for (int i = 1; i <= n+1; i++) {
+ for (int j = 1; j < i; j++) {
+ if (j + time[j] <= i) {
+ dp[i] = Math.max(dp[i], dp[j] + price[j]);
+ }
+ }
+ }
+
+ System.out.println(dp[n+1]);
+ }
+
+ // ์
๋ ฅ ๋ฐ๊ธฐ
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ time = new int[n+2];
+ price = new int[n+2];
+ dp = new int[n+2];
+
+ for (int i = 1; i <= n; i++) {
+ st = new StringTokenizer(br.readLine());
+ time[i] = Integer.parseInt(st.nextToken());
+ price[i] = Integer.parseInt(st.nextToken());
+ }
+ }
+}
+
+/*
+DP Table
+
+7
+3 10
+5 20
+1 10
+1 20
+2 15
+4 40
+2 200
+
+0 3 5 1 1 2 4 2
+0 10 20 10 20 15 40 200
+
+0 1 2 3 4 5 6 7
+0 0 0 10 30 30 45 45
+ */
diff --git a/java/BOJ/Silver/III/S3_1904.java b/java/BOJ/Silver/III/S3_1904.java
new file mode 100644
index 0000000..fe610aa
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_1904.java
@@ -0,0 +1,79 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1904
+ *
+ * ? ์ ๋ชฉ: 01ํ์ผ
+ * ? ์๊ฐ ์ ํ: 0.75์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ง์์ด์๊ฒ 2์ง ์์ด์ ๊ฐ๋ฅด์ณ ์ฃผ๊ธฐ ์ํด, ์ง์์ด ์๋ฒ์ง๋ ๊ทธ์๊ฒ ํ์ผ๋ค์ ์ ๋ฌผํด์ฃผ์
จ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ๊ฐ์ ํ์ผ๋ค์ 0 ๋๋ 1์ด ์ฐ์ฌ ์๋ ๋ฑ์ฅ์ ํ์ผ๋ค์ด๋ค.
+ * ์ด๋ ๋ ์ง๊ถ์ ๋์ฃผ๊ฐ ์ง์์ด์ ๊ณต๋ถ๋ฅผ ๋ฐฉํดํ๊ธฐ ์ํด 0์ด ์ฐ์ฌ์ง ๋ฑ์ฅ์ ํ์ผ๋ค์ ๋ถ์ฌ์ ํ ์์ผ๋ก ์ด๋ฃจ์ด์ง 00 ํ์ผ๋ค์ ๋ง๋ค์๋ค. ๊ฒฐ๊ตญ ํ์ฌ 1 ํ๋๋ง์ผ๋ก ์ด๋ฃจ์ด์ง ํ์ผ ๋๋ 0ํ์ผ์ ๋ ๊ฐ ๋ถ์ธ ํ ์์ 00ํ์ผ๋ค๋ง์ด ๋จ๊ฒ ๋์๋ค.
+ * ๊ทธ๋ฌ๋ฏ๋ก ์ง์์ด๋ ํ์ผ๋ก ๋ ์ด์ ํฌ๊ธฐ๊ฐ N์ธ ๋ชจ๋ 2์ง ์์ด์ ๋ง๋ค ์ ์๊ฒ ๋์๋ค. ์๋ฅผ ๋ค์ด, N=1์ผ ๋ 1๋ง ๋ง๋ค ์ ์๊ณ , N=2์ผ ๋๋ 00, 11์ ๋ง๋ค ์ ์๋ค. (01, 10์ ๋ง๋ค ์ ์๊ฒ ๋์๋ค.) ๋ํ N=4์ผ ๋๋ 0011, 0000, 1001, 1100, 1111 ๋ฑ ์ด 5๊ฐ์ 2์ง ์์ด์ ๋ง๋ค ์ ์๋ค.
+ * ์ฐ๋ฆฌ์ ๋ชฉํ๋ N์ด ์ฃผ์ด์ก์ ๋ ์ง์์ด๊ฐ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๊ฐ์ง์๋ฅผ ์ธ๋ ๊ฒ์ด๋ค. ๋จ ํ์ผ๋ค์ ๋ฌดํํ ๋ง์ ๊ฒ์ผ๋ก ๊ฐ์ ํ์.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ์์ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 1,000,000)
+ *
+ * 4 -> n
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ ๋ฒ์งธ ์ค์ ์ง์์ด๊ฐ ๋ง๋ค ์ ์๋ ๊ธธ์ด๊ฐ N์ธ ๋ชจ๋ 2์ง ์์ด์ ๊ฐ์๋ฅผ 15746์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 5
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 104ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 15MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Silver.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S3_1904 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ์ด๊ธฐ ์ค์
+ static int div = 15746;
+ static int[] dp;
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ int n = Integer.parseInt(br.readLine());
+
+ // * 2. ์์ธ ์ผ์ด์ค ์ฒ๋ฆฌ
+ if (n <= 3) {
+ System.out.println(n);
+ return;
+ }
+
+ // * DP Table ์ด๊ธฐํ
+ dp = new int[n+1];
+ dp[1] = 1;
+ dp[2] = 2;
+ dp[3] = 3;
+ /*
+ dp[i-1]
+ 0011
+ 1001
+ 1111
+
+ dp[i-2]
+ 0000
+ 1100
+ */
+
+ // * 3. DP(Tabulation: Bottom-Up)
+ for (int i = 4; i <= n; i++) {
+ dp[i] = (dp[i-1] % div + dp[i-2] % div) % div;
+ }
+
+ // * 4. ์ถ๋ ฅ
+ System.out.println(dp[n]);
+ }
+
+}
diff --git a/java/BOJ/Silver/III/S3_2193.java b/java/BOJ/Silver/III/S3_2193.java
new file mode 100644
index 0000000..32b7043
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_2193.java
@@ -0,0 +1,78 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2193
+ *
+ * ? ์ ๋ชฉ: ์ด์น์
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * 0๊ณผ 1๋ก๋ง ์ด๋ฃจ์ด์ง ์๋ฅผ ์ด์ง์๋ผ ํ๋ค. ์ด๋ฌํ ์ด์ง์ ์ค ํน๋ณํ ์ฑ์ง์ ๊ฐ๋ ๊ฒ๋ค์ด ์๋๋ฐ, ์ด๋ค์ ์ด์น์(pinary number)๋ผ ํ๋ค. ์ด์น์๋ ๋ค์์ ์ฑ์ง์ ๋ง์กฑํ๋ค.
+ * ์ด์น์๋ 0์ผ๋ก ์์ํ์ง ์๋๋ค.
+ * ์ด์น์์์๋ 1์ด ๋ ๋ฒ ์ฐ์์ผ๋ก ๋ํ๋์ง ์๋๋ค. ์ฆ, 11์ ๋ถ๋ถ ๋ฌธ์์ด๋ก ๊ฐ์ง ์๋๋ค.
+ * ์๋ฅผ ๋ค๋ฉด 1, 10, 100, 101, 1000, 1001 ๋ฑ์ด ์ด์น์๊ฐ ๋๋ค. ํ์ง๋ง 0010101์ด๋ 101101์ ๊ฐ๊ฐ 1, 2๋ฒ ๊ท์น์ ์๋ฐฐ๋๋ฏ๋ก ์ด์น์๊ฐ ์๋๋ค.
+ * N(1 โค N โค 90)์ด ์ฃผ์ด์ก์ ๋, N์๋ฆฌ ์ด์น์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 3 -> n
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ N์๋ฆฌ ์ด์น์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 2
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 76ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 2
+ */
+package Silver.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S3_2193 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ // * ํ์ฑ
+ static int n;
+
+ // * ์ด๊ธฐ ์ค์
+ static long[] dp;
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ n = Integer.parseInt(br.readLine());
+
+ // * ์์ธ ์ฒ๋ฆฌ
+ if (n == 1) {
+ System.out.println(1);
+ return;
+ }
+
+ // * 2. end case
+ dp = new long[n+1];
+ dp[1] = 1;
+ dp[2] = 1;
+
+ // * 3. DP(Memoization)
+ topDown(n);
+
+ // * 4. ์ถ๋ ฅ
+ System.out.println(dp[n]);
+ }
+
+ // # DP(Top-Down: Memoization)
+ public static long topDown(int idx) {
+ if (dp[idx] > 0) {
+ return dp[idx];
+ }
+
+ dp[idx] = topDown(idx-1) + topDown(idx-2);
+ return dp[idx];
+ }
+}
diff --git a/java/BOJ/Silver/III/S3_2579.java b/java/BOJ/Silver/III/S3_2579.java
new file mode 100644
index 0000000..2c3f059
--- /dev/null
+++ b/java/BOJ/Silver/III/S3_2579.java
@@ -0,0 +1,81 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/2579
+ *
+ * ? ์ ๋ชฉ: ๊ณ๋จ ์ค๋ฅด๊ธฐ
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๊ณ๋จ์ ํ ๋ฒ์ ํ ๊ณ๋จ์ฉ ๋๋ ๋ ๊ณ๋จ์ฉ ์ค๋ฅผ ์ ์๋ค. ์ฆ, ํ ๊ณ๋จ์ ๋ฐ์ผ๋ฉด์ ์ด์ด์ ๋ค์ ๊ณ๋จ์ด๋, ๋ค์ ๋ค์ ๊ณ๋จ์ผ๋ก ์ค๋ฅผ ์ ์๋ค.
+ * ์ฐ์๋ ์ธ ๊ฐ์ ๊ณ๋จ์ ๋ชจ๋ ๋ฐ์์๋ ์ ๋๋ค. ๋จ, ์์์ ์ ๊ณ๋จ์ ํฌํจ๋์ง ์๋๋ค.
+ * ๋ง์ง๋ง ๋์ฐฉ ๊ณ๋จ์ ๋ฐ๋์ ๋ฐ์์ผ ํ๋ค.
+ * ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ๊ณ๋จ์ ๋ฐ๊ณ ์ด์ด ๋ ๋ฒ์งธ ๊ณ๋จ์ด๋, ์ธ ๋ฒ์งธ ๊ณ๋จ์ผ๋ก ์ค๋ฅผ ์ ์๋ค. ํ์ง๋ง, ์ฒซ ๋ฒ์งธ ๊ณ๋จ์ ๋ฐ๊ณ ์ด์ด ๋ค ๋ฒ์งธ ๊ณ๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๊ฑฐ๋, ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ๊ณ๋จ์ ์ฐ์ํด์ ๋ชจ๋ ๋ฐ์ ์๋ ์๋ค.
+ * ๊ฐ ๊ณ๋จ์ ์ฐ์ฌ ์๋ ์ ์๊ฐ ์ฃผ์ด์ง ๋ ์ด ๊ฒ์์์ ์ป์ ์ ์๋ ์ด ์ ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฒซ์งธ ์ค์ ๊ณ๋จ์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค.
+ * ๋์งธ ์ค๋ถํฐ ํ ์ค์ ํ๋์ฉ ์ ์ผ ์๋์ ๋์ธ ๊ณ๋จ๋ถํฐ ์์๋๋ก ๊ฐ ๊ณ๋จ์ ์ฐ์ฌ ์๋ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ณ๋จ์ ๊ฐ์๋ 300์ดํ์ ์์ฐ์์ด๊ณ , ๊ณ๋จ์ ์ฐ์ฌ ์๋ ์ ์๋ 10,000์ดํ์ ์์ฐ์์ด๋ค.
+ *
+ * 6 -> n
+ * 10 -> stair[1]
+ * 20
+ * 15
+ * 25
+ * 10
+ * 20 -> stair[n]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๊ณ๋จ ์ค๋ฅด๊ธฐ ๊ฒ์์์ ์ป์ ์ ์๋ ์ด ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 75
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 76ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 115MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 4
+ */
+package Silver.III;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S3_2579 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ static int n;
+ static int[] stair;
+ static int[] dp;
+
+ public static void main(String[] args) throws IOException {
+ input();
+
+ if (n == 1) {
+ System.out.println(stair[n]);
+ return;
+ }
+
+ dp[1] = stair[1];
+ dp[2] = stair[1] + stair[2];
+
+ for (int i = 3; i <= n; i++) {
+ dp[i] = Math.max(dp[i-3] + stair[i-1], dp[i-2]) + stair[i];
+ }
+
+ System.out.println(dp[n]);
+
+ }
+
+ public static void input() throws IOException {
+ n = Integer.parseInt(br.readLine());
+
+ stair = new int[n + 1];
+ dp = new int[n + 1];
+
+ for (int i = 1 ; i <= n; i++) {
+ stair[i] = Integer.parseInt(br.readLine());
+ }
+ }
+}
diff --git a/java/BOJ/Silver/IV/S4_11047.java b/java/BOJ/Silver/IV/S4_11047.java
new file mode 100644
index 0000000..b7258a3
--- /dev/null
+++ b/java/BOJ/Silver/IV/S4_11047.java
@@ -0,0 +1,78 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/11047
+ *
+ * ? ์ ๋ชฉ: ๋์ 0
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 256MB
+ *
+ * ? ๋ฌธ์
+ * ์ค๊ท๊ฐ ๊ฐ์ง๊ณ ์๋ ๋์ ์ ์ด N์ข
๋ฅ์ด๊ณ , ๊ฐ๊ฐ์ ๋์ ์ ๋งค์ฐ ๋ง์ด ๊ฐ์ง๊ณ ์๋ค.
+ * ๋์ ์ ์ ์ ํ ์ฌ์ฉํด์ ๊ทธ ๊ฐ์น์ ํฉ์ K๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ด๋ ํ์ํ ๋์ ๊ฐ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ค. (1 โค N โค 10, 1 โค K โค 100,000,000)
+ * ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๋์ ์ ๊ฐ์น Ai๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฃผ์ด์ง๋ค. (1 โค Ai โค 1,000,000, A1 = 1, i โฅ 2์ธ ๊ฒฝ์ฐ์ Ai๋ Ai-1์ ๋ฐฐ์)
+ *
+ * 10 4200 -> n k
+ * 1 -> coin[0]
+ * 5
+ * 10
+ * 50
+ * 100
+ * 500
+ * 1000
+ * 5000
+ * 10000
+ * 50000 -> coin[n-1]
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ K์์ ๋ง๋๋๋ฐ ํ์ํ ๋์ ๊ฐ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
+ *
+ * 12
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076์ด
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.IV;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.StringTokenizer;
+
+public class S4_11047 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ static int n, k;
+ static Integer[] coin;
+
+ public static void main(String[] args) throws IOException {
+ input();
+ int count = 0;
+ for (int i = 0; i < n; i++) {
+ int c = k / coin[i];
+ count += c;
+ k -= coin[i] * c;
+ }
+ System.out.println(count);
+ }
+
+ public static void input() throws IOException {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ coin = new Integer[n];
+ for (int i = 0; i < n; i++) {
+ coin[i] = Integer.parseInt(br.readLine());
+ }
+
+ Arrays.sort(coin, Collections.reverseOrder());
+ }
+}
diff --git a/java/BOJ/Silver/V/S5_1010.java b/java/BOJ/Silver/V/S5_1010.java
new file mode 100644
index 0000000..ff976c7
--- /dev/null
+++ b/java/BOJ/Silver/V/S5_1010.java
@@ -0,0 +1,99 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/1010
+ *
+ * ? ์ ๋ชฉ: ๋ค๋ฆฌ ๋๊ธฐ
+ * ? ์๊ฐ ์ ํ: 0.5์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ์ฌ์์ด๋ ํ ๋์์ ์์ฅ์ด ๋์๋ค. ์ด ๋์์๋ ๋์๋ฅผ ๋์ชฝ๊ณผ ์์ชฝ์ผ๋ก ๋๋๋ ํฐ ์ผ์ง์ ๋ชจ์์ ๊ฐ์ด ํ๋ฅด๊ณ ์๋ค. ํ์ง๋ง ์ฌ์์ด๋ ๋ค๋ฆฌ๊ฐ ์์ด์ ์๋ฏผ๋ค์ด ๊ฐ์ ๊ฑด๋๋๋ฐ ํฐ ๋ถํธ์ ๊ฒช๊ณ ์์์ ์๊ณ ๋ค๋ฆฌ๋ฅผ ์ง๊ธฐ๋ก ๊ฒฐ์ฌํ์๋ค. ๊ฐ ์ฃผ๋ณ์์ ๋ค๋ฆฌ๋ฅผ ์ง๊ธฐ์ ์ ํฉํ ๊ณณ์ ์ฌ์ดํธ๋ผ๊ณ ํ๋ค. ์ฌ์์ด๋ ๊ฐ ์ฃผ๋ณ์ ๋ฉด๋ฐํ ์กฐ์ฌํด ๋ณธ ๊ฒฐ๊ณผ ๊ฐ์ ์์ชฝ์๋ N๊ฐ์ ์ฌ์ดํธ๊ฐ ์๊ณ ๋์ชฝ์๋ M๊ฐ์ ์ฌ์ดํธ๊ฐ ์๋ค๋ ๊ฒ์ ์์๋ค. (N โค M)
+ * ์ฌ์์ด๋ ์์ชฝ์ ์ฌ์ดํธ์ ๋์ชฝ์ ์ฌ์ดํธ๋ฅผ ๋ค๋ฆฌ๋ก ์ฐ๊ฒฐํ๋ ค๊ณ ํ๋ค. (์ด๋ ํ ์ฌ์ดํธ์๋ ์ต๋ ํ ๊ฐ์ ๋ค๋ฆฌ๋ง ์ฐ๊ฒฐ๋ ์ ์๋ค.) ์ฌ์์ด๋ ๋ค๋ฆฌ๋ฅผ ์ต๋ํ ๋ง์ด ์ง์ผ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์์ชฝ์ ์ฌ์ดํธ ๊ฐ์๋งํผ (N๊ฐ) ๋ค๋ฆฌ๋ฅผ ์ง์ผ๋ ค๊ณ ํ๋ค. ๋ค๋ฆฌ๋ผ๋ฆฌ๋ ์๋ก ๊ฒน์ณ์ง ์ ์๋ค๊ณ ํ ๋ ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์
๋ ฅ์ ์ฒซ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ
์คํธ์ผ์ด์ค์ ๋ํด ๊ฐ์ ์์ชฝ๊ณผ ๋์ชฝ์ ์๋ ์ฌ์ดํธ์ ๊ฐ์ ์ ์ N, M (0 < N โค M < 30)์ด ์ฃผ์ด์ง๋ค.
+ *
+ * 3
+ * 2 2
+ * 1 5
+ * 13 29
+ *
+ * ? ์ถ๋ ฅ
+ * ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ์ฃผ์ด์ง ์กฐ๊ฑดํ์ ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ * 5
+ * 67863915
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 80ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.V;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S5_1010 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static StringTokenizer st;
+
+ // * ํ์ฑ
+ static int t, n, m;
+
+ public static void main(String[] args) throws IOException {
+ // * 1. ์
๋ ฅ ๋ฐ๊ธฐ
+ t = Integer.parseInt(br.readLine());
+
+ // * 2. DP(Tabulation: Bottom-Up)
+ int[][] dp = new int[31][31];
+
+ // * START-CASE
+ for (int i = 1; i <= 30; i++) {
+ dp[1][i] = i;
+ }
+
+ for (int i = 2; i <= 30; i++) {
+ for (int j = 1; j <= 30; j++) {
+ if (i > j) {
+ continue;
+ }
+
+ if (i == j) {
+ dp[i][j] = 1;
+ } else {
+ dp[i][j] = dp[i-1][j-1] + dp[i][j-1];
+ }
+ }
+ }
+
+ // * 3. ๊ฐ ์ผ์ด์ค๋ง๋ค ์ ๋ต ์ถ๋ ฅ
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 0; i < t; i++) {
+ st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ sb.append(dp[n][m] + "\n");
+ }
+
+ System.out.println(sb.toString());
+ }
+}
+
+/*
+ ๊ท์น: dp[i][j] = dp[i-1][j-1] + dp[i][j-1];
+ 1 2 3 4 5 6 7 8 9 10
+ 1 1 2 3 4 5 6 7 8 9 10
+ 2 1 3 6 10 15 21 28 36 45
+ 3 1
+ 4 1
+ 5 1
+ 6 1
+ 7 1
+
+
+ */
diff --git a/java/BOJ/Silver/V/S5_1439.java b/java/BOJ/Silver/V/S5_1439.java
new file mode 100644
index 0000000..165a844
--- /dev/null
+++ b/java/BOJ/Silver/V/S5_1439.java
@@ -0,0 +1,55 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? ์๊ฐ ์ ํ: 2์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ค์์ด๋ 0๊ณผ 1๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด S๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ค์์ด๋ ์ด ๋ฌธ์์ด S์ ์๋ ๋ชจ๋ ์ซ์๋ฅผ ์ ๋ถ ๊ฐ๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ค. ๋ค์์ด๊ฐ ํ ์ ์๋ ํ๋์ S์์ ์ฐ์๋ ํ๋ ์ด์์ ์ซ์๋ฅผ ์ก๊ณ ๋ชจ๋ ๋ค์ง๋ ๊ฒ์ด๋ค. ๋ค์ง๋ ๊ฒ์ 1์ 0์ผ๋ก, 0์ 1๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์๋ฏธํ๋ค.
+ * ์๋ฅผ ๋ค์ด S=0001100 ์ผ ๋,
+ * ์ ์ฒด๋ฅผ ๋ค์ง์ผ๋ฉด 1110011์ด ๋๋ค.
+ * 4๋ฒ์งธ ๋ฌธ์๋ถํฐ 5๋ฒ์งธ ๋ฌธ์๊น์ง ๋ค์ง์ผ๋ฉด 1111111์ด ๋์ด์ 2๋ฒ ๋ง์ ๋ชจ๋ ๊ฐ์ ์ซ์๋ก ๋ง๋ค ์ ์๋ค.
+ * ํ์ง๋ง, ์ฒ์๋ถํฐ 4๋ฒ์งธ ๋ฌธ์๋ถํฐ 5๋ฒ์งธ ๋ฌธ์๊น์ง ๋ฌธ์๋ฅผ ๋ค์ง์ผ๋ฉด ํ ๋ฒ์ 0000000์ด ๋์ด์ 1๋ฒ ๋ง์ ๋ชจ๋ ๊ฐ์ ์ซ์๋ก ๋ง๋ค ์ ์๋ค.
+ * ๋ฌธ์์ด S๊ฐ ์ฃผ์ด์ก์ ๋, ๋ค์์ด๊ฐ ํด์ผํ๋ ํ๋์ ์ต์ ํ์๋ฅผ ์ถ๋ ฅํ์์ค.
+ *
+ * ? ์
๋ ฅ & ํ์ฑ
+ * ์ฒซ์งธ ์ค์ ๋ฌธ์์ด S๊ฐ ์ฃผ์ด์ง๋ค. S์ ๊ธธ์ด๋ 100๋ง๋ณด๋ค ์๋ค.
+ *
+ * 0001100 -> arr
+ *
+ * ? ์ถ๋ ฅ
+ * ์ฒซ์งธ ์ค์ ๋ค์์ด๊ฐ ํด์ผํ๋ ํ๋์ ์ต์ ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
+ *
+ * 1
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.V;
+
+import java.io.*;
+import java.util.StringTokenizer;
+
+public class S5_1439 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ static StringTokenizer st;
+
+ public static void main(String[] args) throws IOException {
+ char[] arr = br.readLine().toCharArray();
+ int[] count = new int[2];
+
+ int before = -1;
+ for (int i = 0; i < arr.length; i++) {
+ int cur = arr[i] - '0';
+ if (cur != before) {
+ before = cur;
+ count[cur]++;
+ }
+ }
+
+ System.out.println(Math.min(count[0], count[1]));
+ }
+}
diff --git a/java/BOJ/Silver/V/S5_9655.java b/java/BOJ/Silver/V/S5_9655.java
new file mode 100644
index 0000000..28977ff
--- /dev/null
+++ b/java/BOJ/Silver/V/S5_9655.java
@@ -0,0 +1,43 @@
+/**
+ * ? ๋ฌธ์ ์ถ์ฒ: ๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)
+ * ? https://www.acmicpc.net/problem/9655
+ *
+ * ? ์ ๋ชฉ: ๋ ๊ฒ์
+ * ? ์๊ฐ ์ ํ: 1์ด
+ * ? ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
+ *
+ * ? ๋ฌธ์
+ * ๋ ๊ฒ์์ ๋ ๋ช
์ด์ ์ฆ๊ธฐ๋ ์ฌ๋ฐ๋ ๊ฒ์์ด๋ค.
+ * ํ์ ์์ ๋ N๊ฐ๊ฐ ์๋ค. ์๊ทผ์ด์ ์ฐฝ์์ด๋ ํด์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ๋์ ๊ฐ์ ธ๊ฐ๋ฉฐ, ๋์ 1๊ฐ ๋๋ 3๊ฐ ๊ฐ์ ธ๊ฐ ์ ์๋ค. ๋ง์ง๋ง ๋์ ๊ฐ์ ธ๊ฐ๋ ์ฌ๋์ด ๊ฒ์์ ์ด๊ธฐ๊ฒ ๋๋ค.
+ * ๋ ์ฌ๋์ด ์๋ฒฝํ๊ฒ ๊ฒ์์ ํ์ ๋, ์ด๊ธฐ๋ ์ฌ๋์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๊ฒ์์ ์๊ทผ์ด๊ฐ ๋จผ์ ์์ํ๋ค.
+ *
+ * ? ์
๋ ฅ
+ * ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 1000)
+ *
+ * 5
+ *
+ * ? ์ถ๋ ฅ
+ * ์๊ทผ์ด๊ฐ ๊ฒ์์ ์ด๊ธฐ๋ฉด SK๋ฅผ, ์ฐฝ์์ด๊ฐ ๊ฒ์์ ์ด๊ธฐ๋ฉด CY์ ์ถ๋ ฅํ๋ค.
+ *
+ * SK
+ *
+ * ? ์ฑ์ ๊ฒฐ๊ณผ
+ * * ์๊ฐ: 0.076ms
+ * * ๋ฉ๋ชจ๋ฆฌ: 11MB
+ * * ์ธ์ด: JAVA8
+ * * ์๋: 1
+ */
+package Silver.V;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class S5_9655 {
+ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ public static void main(String[] args) throws IOException {
+ int n = Integer.parseInt(br.readLine());
+ System.out.println(n % 2 == 0 ? "CY" : "SK");
+ }
+}
diff --git a/java/BOJ/failed/G1_9328.java b/java/BOJ/failed/G1_9328.java
deleted file mode 100644
index 5d4241f..0000000
--- a/java/BOJ/failed/G1_9328.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package failed;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.StringTokenizer;
-
-public class G1_9328 {
- static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
- static StringTokenizer st;
- static int h, w;
- static char[][] arr;
- static ArrayList[][] visited;
- static int keys;
- static int count;
- static int[] dx = {1, -1, 0, 0};
- static int[] dy = {0, 0, 1, -1};
-
- public static void main(String[] args) throws IOException {
- int t = Integer.parseInt(br.readLine());
- for (int i = 0; i < t; i++) {
- input();
- find();
- bw.write(String.valueOf(count + "\n"));
- }
- bw.flush();
-
- }
-
- public static void find() {
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- if (i == 0 || j == 0 || i == h-1 || j == w-1) {
- if (isKey(arr[i][j])) {
- int nKey = keys | getKey(arr[i][j]);
- arr[i][j] = '.';
- bfs(i, j, nKey);
- return;
- } else if (isDoor(arr[i][j]) && hasKey(arr[i][j], keys)) {
- arr[i][j] = '.';
- bfs(i, j, keys);
- return;
- } else if (arr[i][j] == '$') {
- count++;
- arr[i][j] = '.';
- bfs(i, j, keys);
- return;
- } else if (arr[i][j] == '.') {
- bfs(i, j, keys);
- return;
- }
- }
- }
- }
- }
-
- public static void bfs(int x, int y, int key) {
- LinkedList queue = new LinkedList<>();
- visited[x][y].add(key);
- queue.add(new int[] {x, y, key});
- System.out.println();
-
- while (!queue.isEmpty()) {
- int[] cur = queue.poll();
- int curX = cur[0];
- int curY = cur[1];
- int curKey = cur[2];
- System.out.println(curX + " " + curY + " " + Integer.toBinaryString(curKey) + " " + visited[curX][curY]);
-
- for (int i = 0; i < 4; i++) {
- int nx = curX + dx[i];
- int ny = curY + dy[i];
-
- if (0 <= nx & nx < h && 0 <= ny && ny < w && !alreadyVisited(nx, ny, curKey)) {
- visited[nx][ny].add(curKey);
- if (isKey(arr[nx][ny])) {
- int nextKey = curKey | getKey(arr[nx][ny]);
- queue.add(new int[] {nx, ny, nextKey});
- arr[nx][ny] = '.';
- } else if (isDoor(arr[nx][ny]) && hasKey(arr[nx][ny], curKey)) {
- queue.add(new int[] {nx, ny, curKey});
- arr[nx][ny] = '.';
- } else if (arr[nx][ny] == '$') {
- count++;
- queue.add(new int[] {nx, ny, curKey});
- arr[nx][ny] = '.';
- } else if (arr[nx][ny] == '.') {
- queue.add(new int[] {nx, ny, curKey});
- }
- } else {
- for (int a = 0; a < h; a++) {
- for (int b = 0; b < w; b++) {
- if (a == 0 || b == 0 || a == h-1 || b == w-1 && !alreadyVisited(a, b, curKey)) {
- visited[a][b].add(curKey);
- if (isKey(arr[a][b])) {
- int nextKey = curKey | getKey(arr[a][b]);
- queue.add(new int[] {a, b, nextKey});
- arr[a][b] = '.';
- } else if (isDoor(arr[a][b]) && hasKey(arr[a][b], curKey)) {
- queue.add(new int[] {a, b, curKey});
- arr[a][b] = '.';
- } else if (arr[a][b] == '$') {
- count++;
- queue.add(new int[] {a, b, curKey});
- arr[a][b] = '.';
- } else if (arr[a][b] == '.') {
- queue.add(new int[] {a, b, curKey});
- }
- }
- }
- }
- }
- }
- }
- }
-
- public static boolean alreadyVisited(int x, int y, int curKey) {
- for (int num: visited[x][y]) {
- if (curKey == num) return true;
- }
- return false;
- }
-
- public static boolean isKey(char c) {
- return (0 <= c - 'a') && (c - 'a' < 26);
- }
-
- public static int getKey(char key) {
- return 1 << (key - 'a');
- }
-
- public static boolean isDoor(char c) {
- return (0 <= c - 'A') && (c - 'A' < 26);
- }
-
- public static boolean hasKey(char door, int key) {
- int needKey = 1 << (door - 'A');
- return (key & needKey) != 0;
- }
-
- public static void input() throws IOException {
- st = new StringTokenizer(br.readLine());
- h = Integer.parseInt(st.nextToken());
- w = Integer.parseInt(st.nextToken());
-
- count = 0;
- arr = new char[h][w];
- visited = new ArrayList[h][w];
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- visited[i][j] = new ArrayList();
- }
- }
-
- for (int i = 0; i < h; i++) {
- arr[i] = br.readLine().toCharArray();
- }
-
- char[] k = br.readLine().toCharArray();
- keys = 0;
-
- if (k[0] != '0') {
- for (char c: k) {
- keys |= (1 << (c - 'a'));
- }
- }
- }
-}
diff --git a/java/BOJ/failed/P5_2887.java b/java/BOJ/failed/P5_2887.java
deleted file mode 100644
index 8d33907..0000000
--- a/java/BOJ/failed/P5_2887.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package failed;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-public class P5_2887 {
- static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
- static int n;
- static long cost;
- static int[] parent;
- static ArrayList dists = new ArrayList<>();
- static StringTokenizer st;
-
- public static void main(String[] args) throws IOException {
- n = Integer.parseInt(br.readLine());
- int[][] arr = new int[n][3];
- parent = new int[n];
- for (int i = 0; i < n; i++) {
- parent[i] = i;
- }
-
- for (int i = 0; i < n; i++) {
- st = new StringTokenizer(br.readLine());
- for (int j = 0; j < 3; j++) {
- arr[i][j] = Integer.parseInt(st.nextToken());
- }
- }
-
- for (int i = 0; i < arr.length-1; i++) {
- for (int j = i+1; j < arr.length; j++) {
- dists.add(new int[] {i, j, distance(arr[i], arr[j])});
- }
- }
-
- dists.sort((a, b) -> a[2] - b[2]);
- cost = kruskal();
-
- System.out.println(cost);
- }
-
- public static int distance(int[] x, int[] y) {
- return Math.min(Math.min(Math.abs(x[0] - y[0]), Math.abs(x[1] - y[1])), Math.abs(x[2] - y[2]));
- }
-
- public static long kruskal() {
- long totalDistance = 0;
- int count = 0;
- for (int i = 0; i < dists.size(); i++) {
- int[] tunnel = dists.get(i);
- if (findParent(tunnel[0]) != findParent(tunnel[1])) {
- union(tunnel[0], tunnel[1]);
- totalDistance += tunnel[2];
- count += 1;
- }
-
- if (count == n-1) return totalDistance;
- }
- return -1;
- }
-
- public static int findParent(int node) {
- if (parent[node] != node) {
- parent[node] = findParent(parent[node]);
- }
- return parent[node];
- }
-
- public static void union(int a, int b) {
- a = findParent(a);
- b = findParent(b);
- if (a < b) parent[b] = a;
- else parent[a] = b;
- }
-
-}
diff --git "a/java/Programmers/Level1/\352\263\265\354\233\220 \354\202\260\354\261\205.java" "b/java/Programmers/Level1/\352\263\265\354\233\220 \354\202\260\354\261\205.java"
new file mode 100644
index 0000000..28271ea
--- /dev/null
+++ "b/java/Programmers/Level1/\352\263\265\354\233\220 \354\202\260\354\261\205.java"
@@ -0,0 +1,50 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/172928
+
+import java.util.*;
+
+class Solution {
+ public int[] solution(String[] park, String[] routes) {
+ int[] start = new int[] {0, 0};
+
+ HashMap hm = new HashMap<>();
+ hm.put("N", new int[] {-1, 0});
+ hm.put("S", new int[] {1, 0});
+ hm.put("W", new int[] {0, -1});
+ hm.put("E", new int[] {0, 1});
+
+ char[][] board = new char[park.length][park[0].length()];
+ for (int i = 0; i < park.length; i++) {
+ char[] line = park[i].toCharArray();
+ for (int j = 0; j < line.length; j++) {
+ board[i][j] = line[j];
+ if (board[i][j] == 'S') {
+ start[0] = i;
+ start[1] = j;
+ }
+ }
+ }
+
+ for (String route : routes) {
+ String way = route.split(" ")[0];
+ int weight = Integer.parseInt(route.split(" ")[1]);
+ int nx = start[0];
+ int ny = start[1];
+
+ for (int i = 0; i < weight; i++) {
+ nx += hm.get(way)[0];
+ ny += hm.get(way)[1];
+
+ if (nx < 0 || ny < 0 || nx >= board.length || ny >= board[0].length || board[nx][ny] == 'X') {
+ break;
+ }
+
+ if (i == weight-1) {
+ start[0] = nx;
+ start[1] = ny;
+ }
+ }
+ }
+
+ return start;
+ }
+}
\ No newline at end of file
diff --git "a/java/Programmers/Level1/\353\213\254\353\246\254\352\270\260 \352\262\275\354\243\274.java" "b/java/Programmers/Level1/\353\213\254\353\246\254\352\270\260 \352\262\275\354\243\274.java"
new file mode 100644
index 0000000..d2df077
--- /dev/null
+++ "b/java/Programmers/Level1/\353\213\254\353\246\254\352\270\260 \352\262\275\354\243\274.java"
@@ -0,0 +1,32 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/178871
+
+import java.util.*;
+
+class Solution {
+ public String[] solution(String[] players, String[] callings) {
+ HashMap hm = new HashMap<>();
+ HashMap hm2 = new HashMap<>();
+ String[] answer = new String[players.length];
+
+ for (int i = 0; i < players.length; i++) {
+ hm.put(players[i], i);
+ hm2.put(i, players[i]);
+ }
+
+ for (String call : callings) {
+ // ๋ฐ๋ก ์์ ์ ์ ์ด๋ฆ
+ String loser = hm2.get(hm.get(call)-1);
+
+ hm.put(call, hm.get(call) - 1);
+ hm.put(loser, hm.get(loser) + 1);
+ hm2.put(hm.get(call), call);
+ hm2.put(hm.get(loser), loser);
+ }
+
+ hm.forEach((key, value) -> {
+ answer[value] = key;
+ });
+
+ return answer;
+ }
+}
\ No newline at end of file
diff --git "a/java/Programmers/Level2/\352\263\274\354\240\234 \354\247\204\355\226\211\355\225\230\352\270\260.java" "b/java/Programmers/Level2/\352\263\274\354\240\234 \354\247\204\355\226\211\355\225\230\352\270\260.java"
new file mode 100644
index 0000000..5e6a048
--- /dev/null
+++ "b/java/Programmers/Level2/\352\263\274\354\240\234 \354\247\204\355\226\211\355\225\230\352\270\260.java"
@@ -0,0 +1,70 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/176962
+
+import java.util.*;
+
+class Solution {
+ public String[] solution(String[][] plans) {
+ String[] answer = new String[plans.length];
+ int p = 0;
+
+ Arrays.sort(plans, (a, b) -> {
+ String[] aTime = a[1].split(":");
+ String[] bTime = b[1].split(":");
+
+ if (aTime[0].equals(bTime[0])) {
+ return Integer.parseInt(aTime[1]) - Integer.parseInt(bTime[1]);
+ }
+
+ return Integer.parseInt(aTime[0]) - Integer.parseInt(bTime[0]);
+ });
+
+ Stack stack = new Stack<>();
+
+ for (int i = 0; i < plans.length; i++) {
+ if (i == plans.length - 1) {
+ System.out.println(plans[i][0] + " finished");
+ answer[p++] = plans[i][0];
+ // Stack์ผ๋ก ๋์ด๊ฐ๊ธฐ
+ while (!stack.isEmpty()) {
+ answer[p++] = stack.pop()[0];
+ }
+ } else {
+ int gap = timeGap(plans[i][1], plans[i+1][1]);
+
+ if (gap >= Integer.parseInt(plans[i][2])) {
+ answer[p++] = plans[i][0];
+ gap -= Integer.parseInt(plans[i][2]);
+ System.out.println(plans[i][0] + " finished" + ", gap : " + gap);
+ // ๋จ์ ์๊ฐ๋์ ์คํ์ ์์์จ ์ผ ํ๊ธฐ
+ while (gap > 0 && !stack.isEmpty()) {
+ String[] task = stack.pop();
+ int leftTime = Integer.parseInt(task[1]);
+ if (leftTime > gap) {
+ leftTime -= gap;
+ gap = 0;
+ stack.push(new String[] {task[0], Integer.toString(leftTime)});
+ } else {
+ System.out.println(task[0] + " finished" + ", gap : " + gap);
+ answer[p++] = task[0];
+ gap -= leftTime;
+ }
+ }
+ } else {
+ int left = Integer.parseInt(plans[i][2]) - gap;
+ stack.push(new String[] {plans[i][0], Integer.toString(left)});
+ }
+ }
+ }
+
+ return answer;
+ }
+
+ public int timeGap(String a, String b) {
+ int aHour = Integer.parseInt(a.split(":")[0]);
+ int bHour = Integer.parseInt(b.split(":")[0]);
+ int aMinute = Integer.parseInt(a.split(":")[1]);
+ int bMinute = Integer.parseInt(b.split(":")[1]);
+ return 60 * bHour + bMinute - 60*aHour - aMinute;
+
+ }
+}
\ No newline at end of file
diff --git "a/java/Programmers/Level2/\352\264\221\353\254\274 \354\272\220\352\270\260.java" "b/java/Programmers/Level2/\352\264\221\353\254\274 \354\272\220\352\270\260.java"
new file mode 100644
index 0000000..c3f0b15
--- /dev/null
+++ "b/java/Programmers/Level2/\352\264\221\353\254\274 \354\272\220\352\270\260.java"
@@ -0,0 +1,70 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/172927
+
+import java.util.*;
+
+class Solution {
+ public int solution(int[] picks, String[] minerals) {
+ int dia = picks[0];
+ int iron = picks[1];
+ int stone = picks[2];
+ int Minpiro = Integer.MAX_VALUE;
+
+ HashMap hm = new HashMap<>();
+ hm.put("diamond", new int[] {1, 5, 25});
+ hm.put("iron", new int[] {1, 1, 5});
+ hm.put("stone", new int[] {1, 1, 1});
+
+ // ํ์ฌ ๊ณก๊ดญ์ด, ๋จ์ ํ์, ํ์ฌ ํผ๋ก๋, ๊ด๋ฌผ ์์, dia, iron, stone
+ // 0: dia
+ // 1: iron
+ // 2: stone
+ PriorityQueue pq = new PriorityQueue<>((a, b) -> {
+ return a[2] - b[2];
+ });
+
+ if (dia > 0) {
+ pq.add(new int[] {0, 5, 0, 0, dia-1, iron, stone});
+ }
+
+ if (iron > 0) {
+ pq.add(new int[] {1, 5, 0, 0, dia, iron-1, stone});
+ }
+
+ if (stone > 0) {
+ pq.add(new int[] {2, 5, 0, 0, dia, iron, stone-1});
+ }
+
+ while (!pq.isEmpty()) {
+ int[] cur = pq.poll();
+ if (cur[3] == minerals.length) {
+ return cur[2];
+ }
+
+ int piro = hm.get(minerals[cur[3]])[cur[0]]; // ํ์ฌ ๊ณก๊ดญ์ด๋ก ํ์ฌ ์์นํ ๊ด๋ฌผ์ ์บ ๋ ํผ๋ก๋
+ cur[1]--; // ๊ณก๊ดญ์ด ๋จ์ ํ์ ๊ฐ์
+
+ if (cur[1] == 0) {
+ if (cur[4] == 0 && cur[5] == 0 && cur[6] == 0) {
+ Minpiro = Math.min(Minpiro, cur[2] + piro);
+ } else {
+ if (cur[4] > 0) {
+ pq.add(new int[] {0, 5, cur[2] + piro, cur[3]+1, cur[4]-1, cur[5], cur[6]});
+ }
+
+ if (cur[5] > 0) {
+ pq.add(new int[] {1, 5, cur[2] + piro, cur[3]+1, cur[4], cur[5]-1, cur[6]});
+ }
+
+ if (cur[6] > 0) {
+ pq.add(new int[] {2, 5, cur[2] + piro, cur[3]+1, cur[4], cur[5], cur[6]-1});
+ }
+ }
+
+ } else {
+ pq.add(new int[] {cur[0], cur[1], cur[2] + piro, cur[3]+1, cur[4], cur[5], cur[6]});
+ }
+ }
+
+ return Minpiro;
+ }
+}
\ No newline at end of file
diff --git "a/java/Programmers/Level2/\353\221\220 \354\233\220 \354\202\254\354\235\264\354\235\230 \354\240\225\354\210\230 \354\214\215.java" "b/java/Programmers/Level2/\353\221\220 \354\233\220 \354\202\254\354\235\264\354\235\230 \354\240\225\354\210\230 \354\214\215.java"
new file mode 100644
index 0000000..975721f
--- /dev/null
+++ "b/java/Programmers/Level2/\353\221\220 \354\233\220 \354\202\254\354\235\264\354\235\230 \354\240\225\354\210\230 \354\214\215.java"
@@ -0,0 +1,26 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/181187
+
+class Solution {
+ public long solution(int r1, int r2) {
+ long answer = 0;
+
+ for (int x = 1; x < r2; x++) {
+ double sy = Math.sqrt(Math.pow(r1, 2) - Math.pow(x, 2));
+ double by = Math.sqrt(Math.pow(r2, 2) - Math.pow(x, 2));
+ long count = (long) by - (long) sy;
+ if (x == r1) {
+ count -= 1;
+ }
+
+ answer += 4L * count;
+
+ if (sy % 1 == 0) {
+ answer += 4L;
+ }
+ }
+
+ answer += 4 * (r2 - r1 + 1);
+
+ return answer;
+ }
+}
\ No newline at end of file
diff --git "a/java/Programmers/Level2/\353\224\224\355\216\234\354\212\244\352\262\214\354\236\204.java" "b/java/Programmers/Level2/\353\224\224\355\216\234\354\212\244\352\262\214\354\236\204.java"
new file mode 100644
index 0000000..ee18b78
--- /dev/null
+++ "b/java/Programmers/Level2/\353\224\224\355\216\234\354\212\244\352\262\214\354\236\204.java"
@@ -0,0 +1,88 @@
+import java.util.*;
+
+/**
+ * ๋ฌธ์ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/142085
+ *
+ * ์
๋ ฅ์์
+ * n = 7
+ * k = 3
+ * enemy = [4, 2, 4, 5, 3, 3, 1]
+ *
+ * ๊ฒฐ๊ณผ์์
+ * 5
+ */
+
+class Solution {
+ public int solution(int n, int k, int[] enemy) {
+
+ // ์ ์ ๊ฐ์ฅ ์ ์ ๋ณ๋ ฅ์ ํจ์จ์ ์ผ๋ก ์ฐพ๊ธฐ ์ํด ์ฐ์ ์์ํ๋ฅผ ์ ์ธํฉ๋๋ค.
+ int answer = 0;
+ Queue heap = new PriorityQueue<>();
+
+ // "๋ฌด์ ๊ถ"์ ๊ฐฏ์ ๋งํผ ํ๋ฅผ ์ฑ์์ค๋๋ค.
+ for (int i = 0; i < k; i++, answer++) {
+ if (i >= enemy.length) {
+ break;
+ }
+ heap.offer(enemy[i]);
+ }
+
+ // ๋ฌด์ ๊ถ์ด ์์ ๊ฒฝ์ฐ ๋์ ๋ณ๋ ฅ์ด 0 ๋ฏธ๋ง์ผ๋ ๊น์ง ๋ผ์ด๋๋ฅผ ์งํํฉ๋๋ค.
+ if (heap.size() == 0) {
+ for (int i : enemy) {
+ if (n - i > 0) {
+ answer++;
+ n -= i;
+ }
+ }
+ } else { // ์ ์ ๊ฐ์ฅ ์ ์ ๋ณ๋ ฅ ์๊ฐ ๋์ ๋ณ๋ ฅ๋ณด๋ค ํด๋์ ๋ผ์ด๋ ์๊ฐ ์ ๋ต์
๋๋ค.
+ for (int i = k; i < enemy.length; i++, answer++) {
+ heap.offer(enemy[i]);
+ int minValue = heap.poll();
+
+ if (n < minValue) {
+ break;
+ }
+
+ n -= minValue;
+ }
+ }
+ return answer;
+ }
+}
+
+
+/*
+ํ
์คํธ 1 ใ ํต๊ณผ (1.47ms, 79.6MB)
+ํ
์คํธ 2 ใ ํต๊ณผ (6.75ms, 95MB)
+ํ
์คํธ 3 ใ ํต๊ณผ (84.87ms, 136MB)
+ํ
์คํธ 4 ใ ํต๊ณผ (4.96ms, 124MB)
+ํ
์คํธ 5 ใ ํต๊ณผ (2.80ms, 79.6MB)
+ํ
์คํธ 6 ใ ํต๊ณผ (93.06ms, 145MB)
+ํ
์คํธ 7 ใ ํต๊ณผ (76.02ms, 142MB)
+ํ
์คํธ 8 ใ ํต๊ณผ (33.14ms, 135MB)
+ํ
์คํธ 9 ใ ํต๊ณผ (51.91ms, 126MB)
+ํ
์คํธ 10 ใ ํต๊ณผ (142.13ms, 138MB)
+ํ
์คํธ 11 ใ ํต๊ณผ (0.54ms, 122MB)
+ํ
์คํธ 12 ใ ํต๊ณผ (0.88ms, 126MB)
+ํ
์คํธ 13 ใ ํต๊ณผ (0.28ms, 78.3MB)
+ํ
์คํธ 14 ใ ํต๊ณผ (0.42ms, 79MB)
+ํ
์คํธ 15 ใ ํต๊ณผ (0.36ms, 67.5MB)
+ํ
์คํธ 16 ใ ํต๊ณผ (0.33ms, 81.8MB)
+ํ
์คํธ 17 ใ ํต๊ณผ (0.32ms, 73.5MB)
+ํ
์คํธ 18 ใ ํต๊ณผ (0.30ms, 75.7MB)
+ํ
์คํธ 19 ใ ํต๊ณผ (0.28ms, 74.9MB)
+ํ
์คํธ 20 ใ ํต๊ณผ (0.32ms, 77.7MB)
+ํ
์คํธ 21 ใ ํต๊ณผ (0.28ms, 74.8MB)
+ํ
์คํธ 22 ใ ํต๊ณผ (0.46ms, 74.1MB)
+ํ
์คํธ 23 ใ ํต๊ณผ (0.69ms, 77.9MB)
+ํ
์คํธ 24 ใ ํต๊ณผ (0.71ms, 78.6MB)
+ํ
์คํธ 25 ใ ํต๊ณผ (0.58ms, 72.7MB)
+ํ
์คํธ 26 ใ ํต๊ณผ (0.66ms, 76.8MB)
+ํ
์คํธ 27 ใ ํต๊ณผ (0.89ms, 76.1MB)
+ํ
์คํธ 28 ใ ํต๊ณผ (0.54ms, 80.5MB)
+ํ
์คํธ 29 ใ ํต๊ณผ (0.91ms, 81.4MB)
+ํ
์คํธ 30 ใ ํต๊ณผ (0.76ms, 77.6MB)
+ํ
์คํธ 31 ใ ํต๊ณผ (0.59ms, 77.4MB)
+ํ
์คํธ 32 ใ ํต๊ณผ (0.91ms, 85.4MB)
+ */
\ No newline at end of file
diff --git "a/java/Programmers/Level2/\353\246\254\354\275\224\354\263\207 \353\241\234\353\264\207.java" "b/java/Programmers/Level2/\353\246\254\354\275\224\354\263\207 \353\241\234\353\264\207.java"
new file mode 100644
index 0000000..ead1c6a
--- /dev/null
+++ "b/java/Programmers/Level2/\353\246\254\354\275\224\354\263\207 \353\241\234\353\264\207.java"
@@ -0,0 +1,70 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/169199
+
+import java.util.*;
+
+class Solution {
+ public int solution(String[] board) {
+ int[] dx = {1, -1, 0, 0};
+ int[] dy = {0, 0, 1, -1};
+
+ int[] robot = new int[2];
+ int[] goal = new int[2];
+ int[][] road = new int[board.length][board[0].length()];
+
+ for (int i = 0; i < board.length; i++) {
+ char[] line = board[i].toCharArray();
+ for (int j = 0; j < line.length; j++) {
+ if (line[j] == 'R') {
+ robot[0] = i;
+ robot[1] = j;
+ } else if (line[j] == 'G') {
+ goal[0] = i;
+ goal[1] = j;
+ } else if (line[j] == 'D') {
+ road[i][j] = 1;
+ }
+ }
+ }
+
+ Queue queue = new LinkedList<>();
+ int[][] visit = new int[road.length][road[0].length];
+ visit[robot[0]][robot[1]] = 1;
+ queue.add(new int[] {robot[0], robot[1]});
+
+ while (!queue.isEmpty()) {
+ int[] cur = queue.poll();
+
+ if (cur[0] == goal[0] && cur[1] == goal[1]) {
+ return visit[cur[0]][cur[1]] - 1;
+ }
+ for (int k = 0; k < 4; k++) {
+ int nx = cur[0];
+ int ny = cur[1];
+
+ while (true) {
+ if (nx + dx[k] < 0 || nx + dx[k] >= road.length) {
+ break;
+ }
+
+ if (ny + dy[k] < 0 || ny + dy[k] >= road[0].length) {
+ break;
+ }
+
+ if (road[nx + dx[k]][ny + dy[k]] == 1) {
+ break;
+ }
+
+ nx += dx[k];
+ ny += dy[k];
+ }
+
+ if (visit[nx][ny] == 0) {
+ visit[nx][ny] = visit[cur[0]][cur[1]] + 1;
+ queue.add(new int[] {nx, ny});
+ }
+ }
+ }
+
+ return -1;
+ }
+}
\ No newline at end of file
diff --git "a/java/Programmers/Level2/\354\227\260\354\206\215\353\220\234 \353\266\200\353\266\204 \354\210\230\354\227\264\354\235\230 \355\225\251.java" "b/java/Programmers/Level2/\354\227\260\354\206\215\353\220\234 \353\266\200\353\266\204 \354\210\230\354\227\264\354\235\230 \355\225\251.java"
new file mode 100644
index 0000000..3c8f616
--- /dev/null
+++ "b/java/Programmers/Level2/\354\227\260\354\206\215\353\220\234 \353\266\200\353\266\204 \354\210\230\354\227\264\354\235\230 \355\225\251.java"
@@ -0,0 +1,36 @@
+// https://school.programmers.co.kr/learn/courses/30/lessons/178870
+
+class Solution {
+ public int[] solution(int[] sequence, int k) {
+ int[] answer = {0, 0};
+ int left = 0;
+ int right = 0;
+ int sum = 0;
+ int gap = Integer.MAX_VALUE;
+
+ while (left <= right && right < sequence.length) {
+ sum += sequence[right];
+
+ if (sum == k && gap > (right - left)) {
+ gap = right - left;
+ answer[0] = left;
+ answer[1] = right;
+ }
+
+ while (sum >= k) {
+ sum -= sequence[left];
+ left++;
+
+ if (sum == k && gap > (right - left)) {
+ gap = right - left;
+ answer[0] = left;
+ answer[1] = right;
+ }
+ }
+
+ right++;
+ }
+
+ return answer;
+ }
+}
\ No newline at end of file