Problem
Solution
ํด๋น ๋ฌธ์ ๋ Greedy ๋ฌธ์ ์ ๋๋ค.
๊ทธ ์ค์์๋ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด์ผํ๋ ๋ฌธ์ ์ ๋๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด๋?๐ค
"์ปดํจํฐ ๊ณผํ์์, ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ(์์ด: Kruskal’s algorithm)์ ์ต์ ๋น์ฉ ์ ์ฅ ๋ถ๋ถ ํธ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ณ์ ๊ฐ์๋ฅผ {\displaystyle E}E, ๊ผญ์ง์ ์ ๊ฐ์๋ฅผ {\displaystyle V}V๋ผ๊ณ ํ๋ฉด ์ด ์๊ณ ๋ฆฌ์ฆ์ {\displaystyle {\color {Blue}O}(E\log V)}{\color {Blue}O}(E\log V)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค."
์ํค๋ฐฑ๊ณผ์ ์ด๋ ๊ฒ ์ ์๋์ด ์๋๋ฐ์..... ์ ๋ ์ดํดํ๊ธฐ๊ฐ ํ๋ค๋๋ผ๊ตฌ์....๐
๊ทธ๋์ ์ด์ฌํ ์ดํดํด๋ณด๋ ค๊ณ ํ๊ณ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ....
"๊ฐ์ฅ ๊ฐ์ด ๋ฎ์ ์ฐ๊ฒฐ๋ก ์ฐ์ ์ ๋ ฌํ ๋ค ์ฌ์ดํด ์ฆ,๋ฐ๋ณต์ด ์๊ธฐ๋ ๊ตฌ๊ฐ์ ์ ์ธ์์ผ์ฃผ๋ฉด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค!"
๋ผ๊ณ ์ค๋ช ๋๋ฆด์ ์๊ฒ ๋ค์.
์ด๋ ๊ฒ ๋งํ๋ฉด ์ด๋ ค์ฐ๋ ์์ ๋ก ์ค๋ช ๋๋ฆด๊ฒ์!!
๋จผ์ ์๋์ ๊ฐ์ ์ฐ๊ฒฐ๋ค์ด ์๋ค๊ณ ๊ฐ์ ํ ๊ฒ์.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ๊ฐ ์ฐ๊ฒฐ๊ฐ ๊ฐ์ด ๋ฎ์ ์์ผ๋ก ์ ๋ ฌํด๋ณด๋ฉด
1. 3-4 5
2. 3-5 20
3. 4-5 21
4. 1-2 23
5. 2-5 46
6. 1-4 99
๋ก ์ ๋ ฌํ ์ ์๊ฒ ์ฃ ?
๊ทธ๋ฌ๋ฉด ์ ์์๋๋ก ํ๋์ฉ ์ค์ ๋ก ์ฐ๊ฒฐํด์ ๊ฐ์ฅ ๋ฎ์ ์ดํฉ์ ๊ตฌํด๋ด ์๋ค!๐
๋จผ์ 3-4๋ฅผ ์ฐ๊ฒฐํด์ฃผ์๋ฉด ์ดํฉ์ 5๊ฐ ๋๊ฒ ์ฃ ?
๊ทธ ๋ค์์ผ๋ก ๋ฎ์ 3-5๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ฉด ์ดํฉ์ 25๊ฐ ๋๊ฒ ์ฃ ?
๊ทธ ๋ค์์ผ๋ก ๋ฎ์ 4-5๋ฅผ ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํ๋๋ฐ์...
์ฌ๊ธฐ์ ์ ๊น 4-5๋ฅผ ์ฐ๊ฒฐํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ดํด์ ํ์ฑํ๊ฒ ๋ฉ๋๋ค. ๐ฏ
์์์์ ๊ฐ์ด ์ฌ์ดํด์ ํ์ฑํ๋ ์ฐ๊ฒฐ์ ์ ์ธ์์ผ์ค๋๋ค!
๊ทธ ๋ค์์ผ๋ก ๋ฎ์ 1-2๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ฉด ์ดํฉ์ด 48์ด ๋๊ฒ ์ฃ ?
๊ทธ ๋ค์์ผ๋ก ๋ฎ์ 2-5์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ฉด ์ดํฉ์ 94๊ฐ ๋๊ณ ๋ชจ๋ ์ซ์๊ฐ 4 - 3 - 5 - 2 - 1 ๋ก ์ฐ๊ฒฐ๋๊ฑธ ๋ณผ์ ์์ต๋๋ค!!
๋งจ ๋ง์ง๋ง์ธ 1 - 4๋ 4- 3 - 5 - 2 - 1์ ์ฌ์ดํด์ ํ์ฑํ๋ฏ๋ก ์ ์ธ์์ผ์ฃผ๊ณ ๋์ด๊ฐ์ฃผ๋ฉด ๊ฐ์ฅ ๋ฎ์ ์ดํฉ์ 94๊ฐ ๋ฉ๋๋ค.
ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ด ์กฐ๊ธ์ ์ดํด๊ฐ ๋์ จ๋์?
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ดํด์ ํ์ฑํ๋์ง ์๊น์?๐ง
๋ฐ๋ก ๋ถ๋ชจ๋ฅผ ๊ฐ ์ซ์๋ง๋ค ์ ํด์ฃผ๋๊ฒ๋๋ค. (๊ฐ์๊ธฐ ๋ถ๋ชจ๊ฐ ๋์์ ๋นํฉ์ค๋ฌ์ฐ์คํ ๋ฐ์.) ๐
๋ง์ฝ ๋ถ๋ชจ๊ฐ ์๋ค๋ฉด ์ฐ๊ฒฐํ๋ ์ซ์ ์ค ๋ ๋ฎ์ ์ซ์(์ผ์ชฝ๊ฐ)๋ฅผ ๋ ์ซ์์ ๋ถ๋ชจ๋ก ์ง์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ซ์์ ๋ถ๋ชจ๊ฐ ๊ฐ๋ค๋ฉด ๊ทธ๊ฒ์ ์ฌ์ดํด์ด ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ํ ๋ชจ๋ ๋ถ๋ชจ๊ฐ ์๋ค๋ฉด ์ผ์ชฝ๊ฐ์ ๋ถ๋ชจ๋ก ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ถ๋ชจ์ ๊ทธ ์์๋ค์ ๋ถ๋ชจ๋ฅผ ๋ฐ๊ฟ์ค๋๋ค.
์ด๋ ๊ฒ ๋งํ๋ฉด ์ด๋ ค์ฐ๋ ์์ ๋ก ์ค๋ช ๋๋ฆด๊ฒ์!!
3-4๊ฐ ์ฐ๊ฒฐ๋์์๋ 3์ ๋ถ๋ชจ์ 4์ ๋ถ๋ชจ๊ฐ ๋ชจ๋ ์๋ ์ํ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ซ์ ์ค ์ผ์ชฝ์ธ 3์ด 3๊ณผ 4์ ๋ถ๋ชจ๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด 3์ ๋ถ๋ชจ๋ 3์ด ๋๊ณ 4์ ๋ถ๋ชจ๋ 3์ด ๋๊ฒ ์ฃ ? (๋ถ๋ชจ๋ ์ฃผํฉ์ ๋ค๋ชจ ๋ฐ์ค๋ก ํ์ํด๋๊ฒ ์ต๋๋ค.)
๊ทธ ๋ค์์ผ๋ก 3 - 5๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์ฐ๊ฒฐ๋๋ ์ผ์ชฝ๊ฐ์ผ๋ก ๊ทธ ๋ถ๋ชจ๋ฅผ ๋ฐ๋ผ๊ฐ๊ฒ ๋ฉ๋๋ค.
1 - 2์ ์ฐ๊ฒฐ์ 3 - 4์ ์ฐ๊ฒฐ๊ณผ ๊ฐ์ด ์ผ์ชฝ ์ซ์๊ฐ ๋ถ๋ชจ๊ฐ ๋๊ฒ ์ฃ ?
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋์๋ ์ฌ์ดํด์ด ๋ฐ์ํ๋ 4 - 5์ ์ฐ๊ฒฐ์ ๋๋ค.
ํ์ง๋ง ์ด๋ฏธ 4์ 5๋ ๋ถ๋ชจ๊ฐ ์์ฃ ? ๋ถ๋ชจ๋ฅผ ํ์ธํด๋ณด๋ ๋ชจ๋ 3์ด๋ค์.
๊ณ ๋ก ์ฐ๊ฒฐํ๋ ค๋ ๋ ์ชฝ์ ๋ถ๋ชจ๊ฐ ๊ฐ๊ฒ ๋์ด ์ฌ์ดํด์ด๋ผ๊ณ ๊ฐ์ฃผํ๊ฒ ๋๋๊ฑฐ์ฃ !!
๋ง์ ์ค๋ช ๋๋ฆฌ๋ฉด 1 - 2์ ์ฐ๊ฒฐ์ 3 - 4์์ ์ฐ๊ฒฐ์ฒ๋ผ ์ผ์ชฝ๊ฐ์ด ๋ถ๋ชจ๊ฐ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ง์ฝ 2 - 5๋ฅผ ์ฐ๊ฒฐํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
2์ ๋ถ๋ชจ๊ฐ ์๋ ์ํ์ด๊ณ 5์ ๋ถ๋ชจ๊ฐ ์๋ ์ํ์ ๋๋ค.
์ด๋ ๊ฒ ๋ชจ๋ ๋ถ๋ชจ๊ฐ ์๋ ์ํ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ผ์ชฝ์ ๋ถ๋ชจ๋ก ๋ฐ๋ผ๊ฐ๊ฒ ๋๊ณ 5์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ซ์์ ๋ถ๋ชจ ๋ํ ๋์ผํ๊ฒ ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก 1 - 4๋ฅผ ์ฐ๊ฒฐํ๋ ค๊ณ ํ๋ฉด 1์ ๋ถ๋ชจ๋ 1์ด๊ณ 4์ ๋ถ๋ชจ๋ 1์ด๋ฏ๋ก ๊ฐ์ ๋ถ๋ชจ๊ฐ ๋ฉ๋๋ค.
์ด๋ ๊ณง ์ฌ์ดํด์ ํ์ฑํ๋ค๋ ๋ป์ด๋ฏ๋ก ์ ์ธํด์ฃผ๋๋ก ํฉ๋๋ค.
์ด๋ ๊ฒ ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ ์์๋ณด์๋๋ฐ์.
์ฝ๋๋ก ์์ฑํ๋ ๋ถ๋ถ์ ์์ค ์ฝ๋๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์!!
Source Code
P.S
์ฒ์์ ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๊ฒ์ ๋ชฐ๋ผ์ ๊ทธ๋ฅ ์์ ํ์๊ณผ ์ฌ๊ท๋ก ๊ฐ ์ซ์๋ง๋ค ์ฐ๊ฒฐ์ ๋ชจ๋๋ฅผ ํ์ํ๊ณ
๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๋ฐํํ๋ฉด ๋์ง์์๊น? ๋ผ๊ณ ์ฝ๋๋ฅผ ์งฐ๋๋ ํจ์จ๋ ๊ต์ฅํ ์์ข๊ณ ๊ฑฐ์ ๋๋ถ๋ถ์ด ์คํจ๋ผ๊ณ ๋์๋ค....
๋ญ๊ฐ ๊ฒ์ํ์ง์๊ณ ๋ด ์๊ฐ์ผ๋ก ํ์ด์ผ๊ฒ ๋ค๊ณ ๋ค์งํ๊ณ ํ์๋๋ ๊ฑฐ์ ํ๋ฃจ๋ฅผ ์ก์๋จน์๋ค....
๋ค์๋ถํฐ๋ ์ ํด์ง ์๊ฐ๋งํผ๋ง ๊ณ ๋ฏผํ๊ณ ๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ๋ฐ๋ก ๊ฒ์ํด์ ํ์ตํ๋๋ก ํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค.....
import Foundation
var costsCopy = [[Int]]()
var nCopy = Int()
var min = 10000000
func solution(_ n:Int, _ costs:[[Int]]) -> Int {
let numbers = (0..<n).map{$0}
costsCopy = costs
nCopy = n
numbers.forEach{
greedy($0, cost: 0,numbers: Set<Int>(),history: [String]())
}
return min
}
func greedy(_ start:Int,cost:Int,numbers:Set<Int>,history:[String]){
if cost >= min {
return
}
var currentNumbers = Set(numbers)
currentNumbers.insert(start)
if currentNumbers.count == nCopy {
print(history,cost)
min = cost
return
}
let startFilter = costsCopy.filter{$0[0] == start || $0[1] == start}
for s in startFilter {
var destination = Int()
if s[0] == start {
destination = s[1]
}else {
destination = s[0]
}
var newHistory = history
let h = "\(start)\(destination)"
if history.contains(h) {
return
}
newHistory.append(h)
let currentCost = cost + s[2]
greedy(destination, cost: currentCost,numbers: currentNumbers,history: newHistory)
}
}
solution(4, [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]])
Reference
์๋ ๋ธ๋ก๊ทธ์ ํ์ด๊ฐ ๋ง์ ๋์์ด ๋์์ต๋๋ค.
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ฅ ๋จผ ๋ ธ๋ (์ฌ์ด ํ์ด ํฌํจ) (0) | 2021.03.07 |
---|---|
[Swift] 2020 KAKAO BLIND RECRUITMENT ์๋ฌผ์ ์ ์ด์ (0) | 2021.03.01 |
ํ๋ก๊ทธ๋๋จธ์ค N์ผ๋ก ํํ Swift (0) | 2021.02.07 |
ํ๋ก๊ทธ๋๋จธ์ค ๋ ๊ฐ ๋ฝ์์ ๋ํ๊ธฐ Swift (0) | 2021.01.23 |
ํ๋ก๊ทธ๋๋จธ์ค ๋์คํฌ ์ปจํธ๋กค๋ฌ Swift (0) | 2021.01.18 |
๋๊ธ