diff --git a/bona1122/[week6]Set/Distinct_substrings/Distinct_substrings.js b/bona1122/[week6]Set/Distinct_substrings/Distinct_substrings.js new file mode 100644 index 0000000..b7e8c5e --- /dev/null +++ b/bona1122/[week6]Set/Distinct_substrings/Distinct_substrings.js @@ -0,0 +1,19 @@ +// https://www.acmicpc.net/problem/11478 + +const filePath = + process.platform === "linux" + ? "/dev/stdin" + : require("path").join(__dirname, "input.txt") +const input = require("fs").readFileSync(filePath).toString().trim() +const log = console.log + +// 서로 다른 부분 문자열의 개수 출력하기 +// 길이는 1,000 이하. +const set = new Set() +for (let i = 0; i < input.length; i++) { + for (let j = i; j < input.length; j++) { + const sliced = input.slice(i, j + 1) + set.add(sliced) + } +} +log(set.size) diff --git a/bona1122/[week6]Set/Distinct_substrings/input.txt b/bona1122/[week6]Set/Distinct_substrings/input.txt new file mode 100644 index 0000000..8b273b3 --- /dev/null +++ b/bona1122/[week6]Set/Distinct_substrings/input.txt @@ -0,0 +1 @@ +ababc \ No newline at end of file diff --git a/bona1122/[week6]Set/Friend_network/Friend_network.js b/bona1122/[week6]Set/Friend_network/Friend_network.js new file mode 100644 index 0000000..f664eb3 --- /dev/null +++ b/bona1122/[week6]Set/Friend_network/Friend_network.js @@ -0,0 +1,101 @@ +const filePath = + process.platform === "linux" + ? "/dev/stdin" + : require("path").join(__dirname, "input.txt") +const input = require("fs").readFileSync(filePath).toString().trim().split("\n") +const log = console.log + +// 1. 재귀 버전 +const find = (x, parent) => { + if (parent[x] === x) return x + return (parent[x] = find(parent[x], parent)) +} +// 2. 반복문 버전 +const find2 = (x, parent) => { + while (parent[x] !== x) { + parent[x] = parent[parent[x]] + x = parent[x] + } + return x +} + +// 1. 문자열 크기 비교 방식의 union +// - 작은 값을 부모로 선택하여 트리 밸런싱 시도 +// - 문제점: 문자열 비교(a < b)는 사전순 비교라서 예측 불가능한 결과 발생 +const union1 = (a, b, parent, size) => { + a = find(a, parent) + b = find(b, parent) + + if (a < b) { + parent[b] = a + size[a] += size[b] + return size[a] + } else { + parent[a] = b + size[b] += size[a] + return size[b] + } +} +// 2. 단순 병합 방식의 union -> 항상 첫 번째 루트(a)를 부모로 선택 +// -> 작은 값을 부모로 하는 방식보다 트리밸런싱이 비효율적이지만 find에서 경로압축방식을 함께 사용 시 보완된다. +const union2 = (a, b, parent, size) => { + a = find(a, parent) + b = find(b, parent) + if (a !== b) { + parent[b] = a + size[a] += size[b] + } + return size[a] +} + +// 3. rank 기반 union -> 트리높이를 저장한 rank 배열을 활용하여 트리밸런싱 문제 해결 +const union3 = (a, b, parent, size, rank) => { + a = find(a, parent) + b = find(b, parent) + + if (a !== b) { + if (rank[a] < rank[b]) { + // b의 rank가 더 크면 b를 루트로 + parent[a] = b + size[b] += size[a] + return size[b] + } else { + // a의 rank가 더 크거나 같으면 a를 루트로 + parent[b] = a + size[a] += size[b] + if (rank[a] === rank[b]) { + rank[a]++ // rank가 같을 때만 증가 + } + return size[a] + } + } + return size[a] +} + +let test = +input[0] +let currentLine = 1 + +while (test--) { + const F = +input[currentLine] + let parent = {} + let size = {} + let rank = {} + const result = [] + + for (let i = 1; i <= F; i++) { + const [a, b] = input[currentLine + i].split(" ") + + for (let name of [a, b]) { + if (parent[name] === undefined) { + parent[name] = name + size[name] = 1 + rank[name] = 0 + } + } + + result.push(union3(a, b, parent, size, rank)) + } + + log(result.join("\n")) + currentLine += F + 1 +} diff --git a/bona1122/[week6]Set/Friend_network/input.txt b/bona1122/[week6]Set/Friend_network/input.txt new file mode 100644 index 0000000..2803203 --- /dev/null +++ b/bona1122/[week6]Set/Friend_network/input.txt @@ -0,0 +1,9 @@ +2 +3 +Fred Barney +Barney Betty +Betty Wilma +3 +Fred Barney +Betty Wilma +Barney Betty \ No newline at end of file diff --git a/bona1122/[week6]Set/Friend_network/tempCodeRunnerFile.js b/bona1122/[week6]Set/Friend_network/tempCodeRunnerFile.js new file mode 100644 index 0000000..b44460f --- /dev/null +++ b/bona1122/[week6]Set/Friend_network/tempCodeRunnerFile.js @@ -0,0 +1,56 @@ +const filePath = + process.platform === "linux" + ? "/dev/stdin" + : require("path").join(__dirname, "input.txt") +const input = require("fs").readFileSync(filePath).toString().trim().split("\n") +const log = console.log + +// 재귀 버전 +const find = (x) => { + if (parent[x] === x) return x + return (parent[x] = find(parent[x])) +} +// 반복문 버전 +const find2 = (x) => { + while (parent[x] !== x) { + parent[x] = parent[parent[x]] // 경로 압축 + x = parent[x] + } + return x +} + +const union = (a, b) => { + a = find(a) + b = find(b) + + if (a !== b) { + parent[b] = a + size[a] += size[b] // 집합 크기도 추적 + } + return size[a] +} + +let test = +input[0] +let currentLine = 1 +const result = [] +while (test--) { + const F = +input[currentLine] + let parent = {} // 집합 추적 + let size = {} // 집합 크기 추적 + + for (let i = 1; i <= F; i++) { + const [a, b] = input[currentLine + i].split(" ") + + for (let name of [a, b]) { + if (parent[name] === undefined) { + parent[name] = name + size[name] = 1 + } + } + + result.push(union(a, b)) + } + + log(result.join("\n")) + currentLine += F + 1 +} diff --git a/bona1122/[week6]Set/Prime_factors.js b/bona1122/[week6]Set/Prime_factors.js new file mode 100644 index 0000000..96a6e41 --- /dev/null +++ b/bona1122/[week6]Set/Prime_factors.js @@ -0,0 +1,15 @@ +// https://school.programmers.co.kr/learn/courses/30/lessons/120852 + +// n이 주어질때, n의 소인수를 오름차순으로 담은 배열 리턴하기 +function solution(n) { + const factors = new Set() + for (let i = 2; i * i <= n; i++) { + while (n % i === 0) { + factors.add(i) + n /= i + } + } + // 마지막으로 남은 수가 1보다 크면 그 자체가 소수이므로 추가 + if (n > 1) factors.add(n) + return Array.from(factors) +} diff --git a/bona1122/[week6]Set/Set_repr/Set_repr.js b/bona1122/[week6]Set/Set_repr/Set_repr.js new file mode 100644 index 0000000..28d1457 --- /dev/null +++ b/bona1122/[week6]Set/Set_repr/Set_repr.js @@ -0,0 +1,40 @@ +const readline = require("readline") +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}) + +const input = [] +rl.on("line", (line) => { + input.push(line) +}).on("close", () => { + const [n, m] = input[0].split(" ").map(Number) + const parent = Array.from({ length: n + 1 }, (_, idx) => idx) + + const findParent = (x, parent) => { + if (parent[x] !== x) { + parent[x] = findParent(parent[x], parent) + } + return parent[x] + } + const union = (a, b) => { + a = findParent(a, parent) + b = findParent(b, parent) + if (a < b) parent[b] = a + else parent[a] = b + } + + let result = "" + for (let i = 1; i <= m; i++) { + let [op, a, b] = input[i].split(" ").map(Number) + if (op === 0) { + union(a, b) + } else { + if (findParent(a, parent) === findParent(b, parent)) result += "YES\n" + else result += "NO\n" + } + } + + console.log(result.trim()) + process.exit() +}) diff --git a/bona1122/[week6]Set/Set_repr/input.txt b/bona1122/[week6]Set/Set_repr/input.txt new file mode 100644 index 0000000..9f17995 --- /dev/null +++ b/bona1122/[week6]Set/Set_repr/input.txt @@ -0,0 +1,9 @@ +7 8 +0 1 3 +1 1 7 +0 7 6 +1 7 1 +0 3 7 +0 4 2 +0 1 1 +1 1 1 \ No newline at end of file diff --git a/bona1122/[week6]Set/String_set/String_set.js b/bona1122/[week6]Set/String_set/String_set.js new file mode 100644 index 0000000..2834d6e --- /dev/null +++ b/bona1122/[week6]Set/String_set/String_set.js @@ -0,0 +1,24 @@ +// https://www.acmicpc.net/problem/14425 + +const filePath = + process.platform === "linux" + ? "/dev/stdin" + : require("path").join(__dirname, "input.txt") +const input = require("fs").readFileSync(filePath).toString().trim().split("\n") +const log = console.log + +const [N, M] = input[0].split(" ").map(Number) +const S = new Set() // 집합 S를 Set으로 만듭니다 + +// N개의 문자열을 집합 S에 추가 +for (let i = 1; i <= N; i++) { + S.add(input[i]) +} + +let count = 0 +// M개의 문자열 각각이 집합 S에 포함되어 있는지 확인 +for (let i = N + 1; i <= N + M; i++) { + if (S.has(input[i])) count++ +} + +log(count) \ No newline at end of file diff --git a/bona1122/[week6]Set/String_set/input.txt b/bona1122/[week6]Set/String_set/input.txt new file mode 100644 index 0000000..b90a524 --- /dev/null +++ b/bona1122/[week6]Set/String_set/input.txt @@ -0,0 +1,17 @@ +5 11 +baekjoononlinejudge +startlink +codeplus +sundaycoding +codingsh +baekjoon +codeplus +codeminus +startlink +starlink +sundaycoding +codingsh +codinghs +sondaycoding +startrink +icerink \ No newline at end of file diff --git a/bona1122/[week6]Set/Symmetric_diff/Symmetric_diff.js b/bona1122/[week6]Set/Symmetric_diff/Symmetric_diff.js new file mode 100644 index 0000000..e95a548 --- /dev/null +++ b/bona1122/[week6]Set/Symmetric_diff/Symmetric_diff.js @@ -0,0 +1,18 @@ +// https://www.acmicpc.net/problem/1269 + +const filePath = + process.platform === "linux" + ? "/dev/stdin" + : require("path").join(__dirname, "input.txt") +const input = require("fs").readFileSync(filePath).toString().trim().split("\n") +const log = console.log + +// A-B 와 B-A 의 합집합 구하기. +// A에만 있는거, B에만 있는거 총 개수 구하기 + +const [an, bn] = input[0].split(" ").map(Number) +const a = input[1].split(" ").map(Number) +const b = input[2].split(" ").map(Number) +const inter = an + bn - new Set([...a, ...b]).size // 총 개수 - 합집합 갯수 = 교집합 개수 + +log(an + bn - 2 * inter) \ No newline at end of file diff --git a/bona1122/[week6]Set/Symmetric_diff/input.txt b/bona1122/[week6]Set/Symmetric_diff/input.txt new file mode 100644 index 0000000..f24ac0f --- /dev/null +++ b/bona1122/[week6]Set/Symmetric_diff/input.txt @@ -0,0 +1,3 @@ +3 5 +1 2 4 +2 3 4 5 6 \ No newline at end of file