๋ฐ์ํ
๋ฌธ์ ๋งํฌ
https://programmers.co.kr/learn/courses/30/lessons/72411
๋ฌธ์ ์ค๋ช
- ์ ์ถ๋ ฅ[์]๋ ์๋์ ๊ฐ๋ค
- orders
- orders์ ์ฌ๋๋ค์ด ์ฃผ๋ฌธํ ์ฃผ๋ฌธ๋ด์ญ์ด ๋ค์ด์๋ค. ์ ์ถ๋ ฅ ์์ 1๋ฒ์ผ๋ก ๋ณด๋ฉด 6๋ช ์ ์ฌ๋๋ค์ด ์ฃผ๋ฌธํ๋ค.
- ์ฒซ๋ฒ์งธ ์ฌ๋์ "ABCFG" ๋ฉ๋ด๋ฅผ ์ฃผ๋ฌธํ๋ค. A๋ฉ๋ด, B๋ฉ๋ด,,,,
- course
- ์ฃผ์ธ๊ณต '์ค์นดํผ'๋ ์ฝ์ค๋ฉ๋ด๋ฅผ ๊ตฌ์ฑ์ค์ด๋ค.
- [2, 3, 4] ๋ผ๋ ์๋ฏธ๋, 2๊ฐ์ง ๋ฉ๋ด๋ก ๊ตฌ์ฑ๋ ์ฝ์ค, 3๊ฐ์ง ๋ฉ๋ด๋ก ๊ตฌ์ฑ๋ ์ฝ์ค,,, ์ด๋ ๊ฒ ๋ง๋ค๊ฒ ๋ค๋ ๋ป์ด๋ค.
- ์ฝ์ค์๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ์กฐ๊ฑด๋ ์๋ค.
- ์ฝ์ค์๋ฆฌ๋ ์ต์ 2๋ช ์ด์์ ์๋์ผ๋ก ๋ถํฐ ์ฃผ๋ฌธ๋ ๋จํ๋ฉ๋ด ์กฐํฉ์ ๋ํด์๋ง ์ฝ์ค์๋ฆฌ ๋ฉ๋ด ํ๋ณด์ ๋ฃ์ ์ ์๋ค.
- ์ด ์ค๋ช ์ ๋ฐ๋ก ์๋ ์๋ ์ฌ์ง์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
- result
- ์ฃผ์ธ๊ณต '์ค์นดํผ'๊ฐ ๊ตฌ์ฑํ๊ฒ๋ ๋ฉ๋ด์ ๊ตฌ์ฑ์ return ํ๊ธฐ ์ํ ๋ฐฐ์ด์ด๋ค.
- ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฆฌํดํด์ผํ๋ค.
๋ด๊ฐ ํผ ํ์ด (์ฐธ๊ณ ํ ํ์ด ๐ฅฒ)
- dfs ๋จผ์ ๋ง๋ค์
- ๋ด๊ฐ ๋ง๋๋ ค๊ณ ํ๋ course ์์ต๋ ๊ธธ์ด๋ณด๋ค, string(๋ฉ๋ด๊ตฟ๊ฒ )์ด ๊ธธ์ด์ง ๊ฒฝ์ฐ์๋ ๊ณ ๋ คํ์ง ์๋๋ค.
func dfs(index: Int, origin: [Character], newString: String) {
// ๊ตฌํ๋ ค๋ ์ฝ์ค ๊ธธ์ด๋ณด๋ค, string(์๋ก์ด ๋ฉ๋ด ๊ตฌ์ฑ)์ด ๋ ๊ธธ๋ค๋ฉด ๊ณ ๋ คํ์ง ์์
if course.last! < newString.count{
return
}
// string(์๋ก์ด ๋ฉ๋ด ๊ตฌ์ฑ)์ด set(๋ฉ๋ด๊ฐ์: ๋ฑ์ฅํ์)์ ์กด์ฌํ๋์ง ํ์ธ
// ์กด์ฌํ๋ค๋ฉด += 1
// ์กด์ฌํ์ง ์๋ค๋ฉด ๋ฉ๋ด ์์ฒด๋ฅผ set ์ ์ถ๊ฐํด์ค
if course.contains(newString.count) {
if set.keys.contains(newString) {
set[newString]! += 1
} else {
set[newString] = 1
}
}
// dfs index 0๋ถํฐ ๋๋ ค์ ์ฌ๊ท๋ก ์ฐพ์ ๊ฒ
for i in index..<origin.count {
let c = origin[i]
dfs(index: i+1, origin: origin, newString: "\(newString)\(c)")
}
}
- dfs ํ์ ์์
- orders ๋ก๋ถํฐ ์ฃผ๋ฌธ์ ํ๋์ฉ ๊บผ๋ด์ sorted๋ก ์ ๋ฆฌํด์ฃผ๊ณ , ๊ฐ๊ฐ dfs๋๋ ค์ฃผ๋ฉด์ ์์ ์กฐํฉ์ ๋ง๋ค์ด์ค๋ค
for order in orders {
let order = order.sorted()
dfs(index: 0, origin: order, newString: "")
// print("order = \(order), set = \(set)")
// print("----------------------")
}
์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด, ์๋ ์ฌ์ง์ฒ๋ผ ํด๋น order ์์ ๋์ฌ ์ ์๋ ๋ชจ๋ ๋ฉ๋ด๊ตฌ์ฑ์ด ๋ฑ์ฅ
- ์ด์ ์ ๋ฉ๋ด ๊ตฌ์ฑ(set)์์ , 2๋ฒ ์ด์ ์ ํ๋ฐ์ ๋ฉ๋ด๋ง ์ ์ ํด์ค๋ค.
- ์ต๋๊ฐ์ด ๊ฐ์ผ๋ฉด ๋ชจ๋ ํฌํจํด์ผํ๋ค! (4๋ฒ๋ฑ์ฅํ ๋ฉ๋ด๊ฐ "AB", "CD" ์ด๋ฉด ๋๋ค ํฌํจํด์ผํ๋ค๋ ๋ป)
var result = [String]()
for length in course {
let temp = set.filter { $0.key.count == length && $0.value > 1 }
let maxNum = temp.max { $0.value < $1.value }
let menu = temp.filter { maxNum!.value == $0.value }.map { $0.key }
result.append(contentsOf: menu)
}
// return result.sorted() -> ์ต์ข
์ ์ผ๋ก sorted๋ ๊ฐ์ return
์ต์ข ์ฝ๋
import Foundation
//result = ["AC", "ACDE", "BCFG", "CDE"]
var orders = ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
var course = [2,3,4]
func solution(_ orders:[String], _ course:[Int]) -> [String] {
var set = [String: Int]()
func dfs(index: Int, origin: [Character], newString: String) {
if course.last! < newString.count{
return
}
if course.contains(newString.count) {
if set.keys.contains(newString) {
set[newString]! += 1
} else {
set[newString] = 1
}
}
for i in index..<origin.count {
let c = origin[i]
dfs(index: i+1, origin: origin, newString: "\(newString)\(c)")
}
}
// ํ์์์
for order in orders {
let order = order.sorted()
dfs(index: 0, origin: order, newString: "")
// print("order = \(order), set = \(set)")
// print("----------------------")
}
// ์กฐํฉ์ค 2๋ฒ์ด์ ์ ํ๋ฐ์ ๋ฉ๋ด๋ง ๊ฐ๋ฅ
// ์ต๋๊ฐ์ด ๊ฐ์ผ๋ฉด ๋ชจ๋ํฌํจ
var result = [String]()
for length in course {
let temp = set.filter { $0.key.count == length && $0.value > 1 }
let maxNum = temp.max { $0.value < $1.value }
let menu = temp.filter { maxNum!.value == $0.value }.map { $0.key }
result.append(contentsOf: menu)
}
return result.sorted()
}
print(solution(orders, course))
๋ฐ์ํ