Skip to content

Commit 4e18165

Browse files
authored
[Bona1122] 25.02.13 (#44)
* Symmetric diff / 중급 * Distinct substrings / 중급 * Prime factors / 중급 * String set / 심화 * Set repr / 심화 * Friend network / 심화
1 parent 6f730fe commit 4e18165

File tree

12 files changed

+312
-0
lines changed

12 files changed

+312
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// https://www.acmicpc.net/problem/11478
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString().trim()
8+
const log = console.log
9+
10+
// 서로 다른 부분 문자열의 개수 출력하기
11+
// 길이는 1,000 이하.
12+
const set = new Set()
13+
for (let i = 0; i < input.length; i++) {
14+
for (let j = i; j < input.length; j++) {
15+
const sliced = input.slice(i, j + 1)
16+
set.add(sliced)
17+
}
18+
}
19+
log(set.size)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ababc
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
const filePath =
2+
process.platform === "linux"
3+
? "/dev/stdin"
4+
: require("path").join(__dirname, "input.txt")
5+
const input = require("fs").readFileSync(filePath).toString().trim().split("\n")
6+
const log = console.log
7+
8+
// 1. 재귀 버전
9+
const find = (x, parent) => {
10+
if (parent[x] === x) return x
11+
return (parent[x] = find(parent[x], parent))
12+
}
13+
// 2. 반복문 버전
14+
const find2 = (x, parent) => {
15+
while (parent[x] !== x) {
16+
parent[x] = parent[parent[x]]
17+
x = parent[x]
18+
}
19+
return x
20+
}
21+
22+
// 1. 문자열 크기 비교 방식의 union
23+
// - 작은 값을 부모로 선택하여 트리 밸런싱 시도
24+
// - 문제점: 문자열 비교(a < b)는 사전순 비교라서 예측 불가능한 결과 발생
25+
const union1 = (a, b, parent, size) => {
26+
a = find(a, parent)
27+
b = find(b, parent)
28+
29+
if (a < b) {
30+
parent[b] = a
31+
size[a] += size[b]
32+
return size[a]
33+
} else {
34+
parent[a] = b
35+
size[b] += size[a]
36+
return size[b]
37+
}
38+
}
39+
// 2. 단순 병합 방식의 union -> 항상 첫 번째 루트(a)를 부모로 선택
40+
// -> 작은 값을 부모로 하는 방식보다 트리밸런싱이 비효율적이지만 find에서 경로압축방식을 함께 사용 시 보완된다.
41+
const union2 = (a, b, parent, size) => {
42+
a = find(a, parent)
43+
b = find(b, parent)
44+
if (a !== b) {
45+
parent[b] = a
46+
size[a] += size[b]
47+
}
48+
return size[a]
49+
}
50+
51+
// 3. rank 기반 union -> 트리높이를 저장한 rank 배열을 활용하여 트리밸런싱 문제 해결
52+
const union3 = (a, b, parent, size, rank) => {
53+
a = find(a, parent)
54+
b = find(b, parent)
55+
56+
if (a !== b) {
57+
if (rank[a] < rank[b]) {
58+
// b의 rank가 더 크면 b를 루트로
59+
parent[a] = b
60+
size[b] += size[a]
61+
return size[b]
62+
} else {
63+
// a의 rank가 더 크거나 같으면 a를 루트로
64+
parent[b] = a
65+
size[a] += size[b]
66+
if (rank[a] === rank[b]) {
67+
rank[a]++ // rank가 같을 때만 증가
68+
}
69+
return size[a]
70+
}
71+
}
72+
return size[a]
73+
}
74+
75+
let test = +input[0]
76+
let currentLine = 1
77+
78+
while (test--) {
79+
const F = +input[currentLine]
80+
let parent = {}
81+
let size = {}
82+
let rank = {}
83+
const result = []
84+
85+
for (let i = 1; i <= F; i++) {
86+
const [a, b] = input[currentLine + i].split(" ")
87+
88+
for (let name of [a, b]) {
89+
if (parent[name] === undefined) {
90+
parent[name] = name
91+
size[name] = 1
92+
rank[name] = 0
93+
}
94+
}
95+
96+
result.push(union3(a, b, parent, size, rank))
97+
}
98+
99+
log(result.join("\n"))
100+
currentLine += F + 1
101+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2
2+
3
3+
Fred Barney
4+
Barney Betty
5+
Betty Wilma
6+
3
7+
Fred Barney
8+
Betty Wilma
9+
Barney Betty
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const filePath =
2+
process.platform === "linux"
3+
? "/dev/stdin"
4+
: require("path").join(__dirname, "input.txt")
5+
const input = require("fs").readFileSync(filePath).toString().trim().split("\n")
6+
const log = console.log
7+
8+
// 재귀 버전
9+
const find = (x) => {
10+
if (parent[x] === x) return x
11+
return (parent[x] = find(parent[x]))
12+
}
13+
// 반복문 버전
14+
const find2 = (x) => {
15+
while (parent[x] !== x) {
16+
parent[x] = parent[parent[x]] // 경로 압축
17+
x = parent[x]
18+
}
19+
return x
20+
}
21+
22+
const union = (a, b) => {
23+
a = find(a)
24+
b = find(b)
25+
26+
if (a !== b) {
27+
parent[b] = a
28+
size[a] += size[b] // 집합 크기도 추적
29+
}
30+
return size[a]
31+
}
32+
33+
let test = +input[0]
34+
let currentLine = 1
35+
const result = []
36+
while (test--) {
37+
const F = +input[currentLine]
38+
let parent = {} // 집합 추적
39+
let size = {} // 집합 크기 추적
40+
41+
for (let i = 1; i <= F; i++) {
42+
const [a, b] = input[currentLine + i].split(" ")
43+
44+
for (let name of [a, b]) {
45+
if (parent[name] === undefined) {
46+
parent[name] = name
47+
size[name] = 1
48+
}
49+
}
50+
51+
result.push(union(a, b))
52+
}
53+
54+
log(result.join("\n"))
55+
currentLine += F + 1
56+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// https://school.programmers.co.kr/learn/courses/30/lessons/120852
2+
3+
// n이 주어질때, n의 소인수를 오름차순으로 담은 배열 리턴하기
4+
function solution(n) {
5+
const factors = new Set()
6+
for (let i = 2; i * i <= n; i++) {
7+
while (n % i === 0) {
8+
factors.add(i)
9+
n /= i
10+
}
11+
}
12+
// 마지막으로 남은 수가 1보다 크면 그 자체가 소수이므로 추가
13+
if (n > 1) factors.add(n)
14+
return Array.from(factors)
15+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const readline = require("readline")
2+
const rl = readline.createInterface({
3+
input: process.stdin,
4+
output: process.stdout,
5+
})
6+
7+
const input = []
8+
rl.on("line", (line) => {
9+
input.push(line)
10+
}).on("close", () => {
11+
const [n, m] = input[0].split(" ").map(Number)
12+
const parent = Array.from({ length: n + 1 }, (_, idx) => idx)
13+
14+
const findParent = (x, parent) => {
15+
if (parent[x] !== x) {
16+
parent[x] = findParent(parent[x], parent)
17+
}
18+
return parent[x]
19+
}
20+
const union = (a, b) => {
21+
a = findParent(a, parent)
22+
b = findParent(b, parent)
23+
if (a < b) parent[b] = a
24+
else parent[a] = b
25+
}
26+
27+
let result = ""
28+
for (let i = 1; i <= m; i++) {
29+
let [op, a, b] = input[i].split(" ").map(Number)
30+
if (op === 0) {
31+
union(a, b)
32+
} else {
33+
if (findParent(a, parent) === findParent(b, parent)) result += "YES\n"
34+
else result += "NO\n"
35+
}
36+
}
37+
38+
console.log(result.trim())
39+
process.exit()
40+
})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
7 8
2+
0 1 3
3+
1 1 7
4+
0 7 6
5+
1 7 1
6+
0 3 7
7+
0 4 2
8+
0 1 1
9+
1 1 1
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// https://www.acmicpc.net/problem/14425
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString().trim().split("\n")
8+
const log = console.log
9+
10+
const [N, M] = input[0].split(" ").map(Number)
11+
const S = new Set() // 집합 S를 Set으로 만듭니다
12+
13+
// N개의 문자열을 집합 S에 추가
14+
for (let i = 1; i <= N; i++) {
15+
S.add(input[i])
16+
}
17+
18+
let count = 0
19+
// M개의 문자열 각각이 집합 S에 포함되어 있는지 확인
20+
for (let i = N + 1; i <= N + M; i++) {
21+
if (S.has(input[i])) count++
22+
}
23+
24+
log(count)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
5 11
2+
baekjoononlinejudge
3+
startlink
4+
codeplus
5+
sundaycoding
6+
codingsh
7+
baekjoon
8+
codeplus
9+
codeminus
10+
startlink
11+
starlink
12+
sundaycoding
13+
codingsh
14+
codinghs
15+
sondaycoding
16+
startrink
17+
icerink

0 commit comments

Comments
 (0)