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 @@ #### ๐Ÿ† ํ”Œ๋ž˜ํ‹ฐ๋„˜ +[![๋ฐฑ์ค€๋žญํ‚น](http://mazassumnida.wtf/api/v2/generate_badge?boj=y2kdj9723)](https://solved.ac/y2kdj9723) +
#### ๐Ÿ† ๊ณจ๋“œ -[![๋ฐฑ์ค€๋žญํ‚น](http://mazassumnida.wtf/api/v2/generate_badge?boj=y2kdj9723)](https://solved.ac/y2kdj9723) -
#### ๐Ÿ† ์‹ค๋ฒ„ diff --git a/java/BOJ/Gold/I/G1_1208.java b/java/BOJ/Gold/I/G1_1208.java new file mode 100644 index 0000000..c56a8a2 --- /dev/null +++ b/java/BOJ/Gold/I/G1_1208.java @@ -0,0 +1,126 @@ +/** + * ! ๋ฌธ์ œ ์ถœ์ฒ˜: ๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ ธ์ง€(BOJ) + * ? address: https://www.acmicpc.net/problem/1208 + * + * ! ์ œ๋ชฉ: ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ 2 + * ! ์‹œ๊ฐ„ ์ œํ•œ: 1์ดˆ + * ! ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 256MB + * + * ! ๋ฌธ์ œ + * N๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์ด ์žˆ์„ ๋•Œ, ํฌ๊ธฐ๊ฐ€ ์–‘์ˆ˜์ธ ๋ถ€๋ถ„์ˆ˜์—ด ์ค‘์—์„œ ๊ทธ ์ˆ˜์—ด์˜ ์›์†Œ๋ฅผ ๋‹ค ๋”ํ•œ ๊ฐ’์ด S๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + * + * ! ์ž…๋ ฅ & ํŒŒ์‹ฑ + * ์ฒซ์งธ ์ค„์— ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N๊ณผ ์ •์ˆ˜ S๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 40, |S| โ‰ค 1,000,000) ๋‘˜์งธ ์ค„์— N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜์˜ ์ ˆ๋Œ“๊ฐ’์€ 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. + * + * 5 0 -> n s + * -7 -3 -2 5 8 -> arr + * + * ! ์ถœ๋ ฅ + * ์ฒซ์งธ ์ค„์— ํ•ฉ์ด S๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + * + * 1 + * + * ? ์ฑ„์  ๊ฒฐ๊ณผ + * ์‹œ๊ฐ„: 848ms + * ๋ฉ”๋ชจ๋ฆฌ: 30848KB + * ์–ธ์–ด: JAVA8 + */ +package Gold.I; + +import java.io.*; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class G1_1208 { + 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, arr[]; + // ์ดˆ๊ธฐ ์„ค์ • + static long count = 0; + + public static void main(String[] args) throws IOException { + input(); + int half = n / 2; + int[] a = new int[1 << (n-half)]; + int[] b = new int[1 << half]; + + // ! 2์˜ (n-half)์ œ๊ณฑ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งŒํผ ๋ถ€๋ถ„์ˆ˜์—ด์ด ์ƒ๊น€ + for (int i = 0; i < (1 << n-half); i++) { + for (int j = 0; j < n-half; j++) { + if (((1 << j) & i) != 0) { + a[i] += arr[j]; + } + } + } + + // ! 2์˜ half ์ œ๊ณฑ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งŒใ„ดํผ ๋ถ€๋ถ„์ˆ˜์—ด์ด ์ƒ๊น€ + for (int i = 0; i < (1 << half); i++) { + for (int j = 0; j < half; j++) { + if (((1 << j) & i) != 0) { + b[i] += arr[n-half+j]; + } + } + } + + // * ๋‘ ๋ฐฐ์—ด ๋ชจ๋‘ ์ •๋ ฌ + Arrays.sort(a); + Arrays.sort(b); + + // * ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ๋“ค + int ap = 0; + int bp = b.length-1; + + // * ํ•ฉ์ด s๊ฐ€ ๋˜๋Š” ๊ตฌ๊ฐ„๋“ค์„ ๊ณฑํ•จ + // A๊ฐ€ 1๋ถ€ํ„ฐ 3๊นŒ์ง€ 3๊ฐœ๊ฐ€ ๊ฐ™์€๊ฐ’ + // B๊ฐ€ 1๋ถ€ํ„ฐ 2๊นŒ์ง€ 2๊ฐœ๊ฐ€ ๊ฐ™์€๊ฐ’ + // ์ด๋ผ๋ฉด, + // count += 3 * 2 + while (ap < a.length && bp >= 0) { + int av = a[ap]; + int bv = b[bp]; + + if (av + bv > s) { + bp--; + } else if (av + bv < s) { + ap++; + } else { + long ac = 0; + long bc = 0; + + while (ap < a.length && av == a[ap]) { + ac++; + ap++; + } + + while (bp >= 0 && bv == b[bp]) { + bc++; + bp--; + } + + count += (ac * bc); + } + } + + if (s == 0) count--; // ํฌ๊ธฐ๊ฐ€ ์–‘์ˆ˜์ธ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ s๊ฐ€ 0์ผ ๊ฒฝ์šฐ์— ์นด์šดํŠธ 1๊ฐœ๋ฅผ ๋นผ์คŒ + bw.write(String.valueOf(count)); + + br.close(); + bw.flush(); + bw.close(); + } + + public static void input() throws IOException { + st = new StringTokenizer(br.readLine()); + n = Integer.parseInt(st.nextToken()); + s = Integer.parseInt(st.nextToken()); + + 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/I/G1_13460.java b/java/BOJ/Gold/I/G1_13460.java new file mode 100644 index 0000000..d6a520f --- /dev/null +++ b/java/BOJ/Gold/I/G1_13460.java @@ -0,0 +1,177 @@ +/** + * ! ๋ฌธ์ œ ์ถœ์ฒ˜: ๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ ธ์ง€(BOJ) + * ? https://www.acmicpc.net/problem/13459 + * + * ! ์ œ๋ชฉ: ๊ตฌ์Šฌ ํƒˆ์ถœ + * ! ์‹œ๊ฐ„ ์ œํ•œ: 2์ดˆ + * ! ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 512MB + * + * ! ๋ฌธ์ œ + * ์Šคํƒ€ํŠธ๋งํฌ์—์„œ ํŒ๋งคํ•˜๋Š” ์–ด๋ฆฐ์ด์šฉ ์žฅ๋‚œ๊ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ๊ฐ€ ๋งŽ์€ ์ œํ’ˆ์€ ๊ตฌ์Šฌ ํƒˆ์ถœ์ด๋‹ค. ๊ตฌ์Šฌ ํƒˆ์ถœ์€ ์ง์‚ฌ๊ฐํ˜• ๋ณด๋“œ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์„ ํ•˜๋‚˜์”ฉ ๋„ฃ์€ ๋‹ค์Œ, ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ด๋Š” ๊ฒŒ์ž„์ด๋‹ค. + * ๋ณด๋“œ์˜ ์„ธ๋กœ ํฌ๊ธฐ๋Š” N, ๊ฐ€๋กœ ํฌ๊ธฐ๋Š” M์ด๊ณ , ํŽธ์˜์ƒ 1ร—1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ€์žฅ ๋ฐ”๊นฅ ํ–‰๊ณผ ์—ด์€ ๋ชจ๋‘ ๋ง‰ํ˜€์ ธ ์žˆ๊ณ , ๋ณด๋“œ์—๋Š” ๊ตฌ๋ฉ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ํฌ๊ธฐ๋Š” ๋ณด๋“œ์—์„œ 1ร—1ํฌ๊ธฐ์˜ ์นธ์„ ๊ฐ€๋“ ์ฑ„์šฐ๋Š” ์‚ฌ์ด์ฆˆ์ด๊ณ , ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. ๊ฒŒ์ž„์˜ ๋ชฉํ‘œ๋Š” ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด์„œ ๋นผ๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ, ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ ๋œ๋‹ค. + * ์ด๋•Œ, ๊ตฌ์Šฌ์„ ์†์œผ๋กœ ๊ฑด๋“œ๋ฆด ์ˆ˜๋Š” ์—†๊ณ , ์ค‘๋ ฅ์„ ์ด์šฉํ•ด์„œ ์ด๋ฆฌ ์ €๋ฆฌ ๊ตด๋ ค์•ผ ํ•œ๋‹ค. ์™ผ์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๊ธฐ, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๊ธฐ, ์œ„์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๊ธฐ, ์•„๋ž˜์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๊ธฐ์™€ ๊ฐ™์€ ๋„ค ๊ฐ€์ง€ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. + * ๊ฐ๊ฐ์˜ ๋™์ž‘์—์„œ ๊ณต์€ ๋™์‹œ์— ์›€์ง์ธ๋‹ค. ๋นจ๊ฐ„ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ์— ๋น ์ง€๋ฉด ์„ฑ๊ณต์ด์ง€๋งŒ, ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ์— ๋น ์ง€๋ฉด ์‹คํŒจ์ด๋‹ค. ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๋™์‹œ์— ๊ตฌ๋ฉ์— ๋น ์ ธ๋„ ์‹คํŒจ์ด๋‹ค. ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ๋™์‹œ์— ๊ฐ™์€ ์นธ์— ์žˆ์„ ์ˆ˜ ์—†๋‹ค. ๋˜, ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ํฌ๊ธฐ๋Š” ํ•œ ์นธ์„ ๋ชจ๋‘ ์ฐจ์ง€ํ•œ๋‹ค. ๊ธฐ์šธ์ด๋Š” ๋™์ž‘์„ ๊ทธ๋งŒํ•˜๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ๊ตฌ์Šฌ์ด ์›€์ง์ด์ง€ ์•Š์„ ๋•Œ ๊นŒ์ง€์ด๋‹ค. + * ๋ณด๋“œ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋งŒ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + * + * ! ์ž…๋ ฅ & ํŒŒ์‹ฑ + * ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ณด๋“œ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ 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์„ ์ถœ๋ ฅํ•œ๋‹ค. + * + * 1 + */ +package Gold.I; + +import java.io.*; +import java.util.LinkedList; +import java.util.Queue; + +public class G1_13460 { + 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 int result = -1; + static boolean[][][][] visited; + + // ! ๋ฉ”์ธ ํ•จ์ˆ˜ + public static void main(String[] args) throws IOException { + input(); // * ์ž…๋ ฅ๋ฐ›๊ธฐ + findBead(); // * ๊ตฌ์Šฌ๊ณผ ๊ตฌ๋ฉ ์œ„์น˜ ์ฐพ๊ธฐ + bfs(); // * BFS ์ˆ˜ํ–‰ + + bw.write(String.valueOf(result)); + + // ๋‹ซ๊ธฐ + 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 = 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