Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions bona1122/[week6]Set/Distinct_substrings/Distinct_substrings.js
Original file line number Diff line number Diff line change
@@ -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)
1 change: 1 addition & 0 deletions bona1122/[week6]Set/Distinct_substrings/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ababc
101 changes: 101 additions & 0 deletions bona1122/[week6]Set/Friend_network/Friend_network.js
Original file line number Diff line number Diff line change
@@ -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
}
9 changes: 9 additions & 0 deletions bona1122/[week6]Set/Friend_network/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
2
3
Fred Barney
Barney Betty
Betty Wilma
3
Fred Barney
Betty Wilma
Barney Betty
56 changes: 56 additions & 0 deletions bona1122/[week6]Set/Friend_network/tempCodeRunnerFile.js
Original file line number Diff line number Diff line change
@@ -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
}
15 changes: 15 additions & 0 deletions bona1122/[week6]Set/Prime_factors.js
Original file line number Diff line number Diff line change
@@ -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)
}
40 changes: 40 additions & 0 deletions bona1122/[week6]Set/Set_repr/Set_repr.js
Original file line number Diff line number Diff line change
@@ -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()
})
9 changes: 9 additions & 0 deletions bona1122/[week6]Set/Set_repr/input.txt
Original file line number Diff line number Diff line change
@@ -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
24 changes: 24 additions & 0 deletions bona1122/[week6]Set/String_set/String_set.js
Original file line number Diff line number Diff line change
@@ -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)
17 changes: 17 additions & 0 deletions bona1122/[week6]Set/String_set/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
5 11
baekjoononlinejudge
startlink
codeplus
sundaycoding
codingsh
baekjoon
codeplus
codeminus
startlink
starlink
sundaycoding
codingsh
codinghs
sondaycoding
startrink
icerink
18 changes: 18 additions & 0 deletions bona1122/[week6]Set/Symmetric_diff/Symmetric_diff.js
Original file line number Diff line number Diff line change
@@ -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)
3 changes: 3 additions & 0 deletions bona1122/[week6]Set/Symmetric_diff/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
3 5
1 2 4
2 3 4 5 6
Loading