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
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
objects = {

/* Begin PBXBuildFile section */
B8699B972C87274E00A18058 /* boj_12865.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8699B962C87274E00A18058 /* boj_12865.swift */; };
B8A7D2742C4E411D00B4BF87 /* 7_23_Document.docc in Sources */ = {isa = PBXBuildFile; fileRef = B8A7D2732C4E411D00B4BF87 /* 7_23_Document.docc */; };
B8B1C6EC2C9EAF350093647C /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B1C6EB2C9EAF350093647C /* main.swift */; };
B8D7469B2C368B85007AF3E2 /* HeapAndPQ.docc in Sources */ = {isa = PBXBuildFile; fileRef = B8D7469A2C368B85007AF3E2 /* HeapAndPQ.docc */; };
/* End PBXBuildFile section */

Expand Down Expand Up @@ -36,6 +36,7 @@
B8975B682C7CC40100BC48DB /* boj_1149.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = boj_1149.swift; sourceTree = "<group>"; };
B8A7D2732C4E411D00B4BF87 /* 7_23_Document.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = 7_23_Document.docc; sourceTree = "<group>"; };
B8A7D2752C4E4AAE00B4BF87 /* programmers_n+1카드게임.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "programmers_n+1카드게임.swift"; sourceTree = "<group>"; };
B8B1C6EB2C9EAF350093647C /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
B8CA3C1E2C74919F00B4B31A /* boj_2839.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = boj_2839.swift; sourceTree = "<group>"; };
B8D746952C3681D9007AF3E2 /* boj_1715.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = boj_1715.swift; sourceTree = "<group>"; };
B8D7469A2C368B85007AF3E2 /* HeapAndPQ.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = HeapAndPQ.docc; sourceTree = "<group>"; };
Expand Down Expand Up @@ -90,6 +91,7 @@
B889E0692C33C2AC00809148 /* AlgorithmStudyS8JH */ = {
isa = PBXGroup;
children = (
B8B1C6EA2C9EAF0E0093647C /* 9.21 */,
B8699B952C87274500A18058 /* 9.3 */,
B8975B632C7B185E00BC48DB /* 8.27 */,
B8CA3C1D2C74918100B4B31A /* 8.20 */,
Expand Down Expand Up @@ -131,6 +133,14 @@
path = 7.23;
sourceTree = "<group>";
};
B8B1C6EA2C9EAF0E0093647C /* 9.21 */ = {
isa = PBXGroup;
children = (
B8B1C6EB2C9EAF350093647C /* main.swift */,
);
path = 9.21;
sourceTree = "<group>";
};
B8CA3C1D2C74918100B4B31A /* 8.20 */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -225,7 +235,7 @@
files = (
B8A7D2742C4E411D00B4BF87 /* 7_23_Document.docc in Sources */,
B8D7469B2C368B85007AF3E2 /* HeapAndPQ.docc in Sources */,
B8699B972C87274E00A18058 /* boj_12865.swift in Sources */,
B8B1C6EC2C9EAF350093647C /* main.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
Binary file not shown.
82 changes: 82 additions & 0 deletions jihyeon/AlgorithmStudyS8JH/AlgorithmStudyS8JH/9.21/main.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
//
// main.swift
// AlgorithmStudyS8JH
//
// Created by 김지현 on 9/21/24.
//

/*
N은 거리에 있는 아이들의 수,M은 아이들의 친구 관계 수, K는 울음소리가 공명하기 위한 최소 아이의 수이다.
둘째 줄에는 아이들이 받은 사탕의 수를 나타내는 정수
셋째 줄부터 M개 줄에 갈쳐 각각의 줄에 정수 a, b가 주어진다.
이는 a와 b가 친구임을 의미한다. 같은 친구 관계가 두 번 주어지는 경우는 없다.
*/

// 시간초과
// Q 친구 관계가 없는 아이는 없나

import Foundation

let firstLine = readLine()!.components(separatedBy: " ").map { Int($0)! }
let N = firstLine[0] // 아이 수
let M = firstLine[1] // 아이들의 관계 수
let K = firstLine[2] // 공명 가능한 최소 아이 수

// 아이의 숫자가 1부터 시작하기 때문에 idx 0에 허수 삽입
var candies: [Int] = [0] + readLine()!.components(separatedBy: " ").map { Int($0)! }
var friends: [Int] = Array.init(repeating: 1, count: N + 1)

// Union Find
var parent = Array(0...N)
func find(_ num: Int) -> Int {
if num != parent[num] {
parent[num] = find(parent[num])
}
return parent[num]
}

func unionFind(x: Int, y: Int) {
let rootX = find(x)
let rootY = find(y)
if rootX != rootY {
if rootX < rootY {
parent[rootY] = rootX
} else {
parent[rootX] = rootY
}
}
}

// [0, 1, 2, 1, 4, 2, 2, 7, 7, 4, 2]
for _ in 0 ..< M {
let r = readLine()!.components(separatedBy: " ").map { Int($0)! }
unionFind(x: r[0], y: r[1])
}

for i in 0 ... N {
if i != parent[i] {
friends[find(i)] += 1
candies[find(i)] += candies[i]
// root가 되는 친구의 index에 그룹 내의 친구 수, 사탕 수가 저장될 것
}
}

parent = Array(Set(parent).subtracting([0]))
// 아이들을 다 돌 필요 없이 우두머리 친구를 통해 그룹 통째로 확인하면 됨
var dp: [[Int]] = [[Int]](repeating: [Int](repeating: 0, count: K+1), count: parent.count)
for i in 0 ..< parent.count {
let rep = parent[i]
for j in 1 ... K {
if i == 0 {
dp[i][j] = friends[rep] <= j ? candies[rep] : 0
} else {
if friends[rep] <= j { // 그룹 다 뺏어도 들키지 않는 범위 내일 때
dp[i][j] = max(dp[i-1][j], dp[i-1][j-friends[rep]] + candies[rep])
} else { // 이 그룹의 사탕을 뺏을 경우 K를 넘어갈 때
dp[i][j] = dp[i-1][j]
}
}
}
}

print(dp.last![K-1])