๐ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์
โ๐ป ๋ฌธ์ ํ์ด Github ๋งํฌ
๋ฌธ์ ์ค๋ช
์ฝ๋๋ ๋งค์ผ ๋ค๋ฅธ ์ท์ ์กฐํฉํ์ฌ ์ ๋๊ฒ์ ์ข์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฝ๋๊ฐ ๊ฐ์ง ์ท์ด ์๋์ ๊ฐ๊ณ , ์ค๋ ์ฝ๋๊ฐ ๋๊ทธ๋ ์๊ฒฝ, ๊ธด ์ฝํธ, ํ๋์ ํฐ์ ์ธ ๋ฅผ ์ ์๋ค๋ฉด ๋ค์๋ ์ ์ฒญ๋ฐ์ง๋ฅผ ์ถ๊ฐ๋ก ์ ๊ฑฐ๋ ๋๊ทธ๋ ์๊ฒฝ ๋์ ๊ฒ์ ์ ๊ธ๋ผ์ค๋ฅผ ์ฐฉ์ฉํ๊ฑฐ๋ ํด์ผํฉ๋๋ค.
์ข ๋ฅ | ์ด๋ฆ |
์ผ๊ตด | ๋๊ทธ๋ ์๊ฒฝ, ๊ฒ์ ์ ๊ธ๋ผ์ค |
์์ | ํ๋์ ํฐ์ ์ธ |
ํ์ | ์ฒญ๋ฐ์ง |
๊ฒ์ท | ๊ธด ์ฝํธ |
- ์ฝ๋๋ ๊ฐ ์ข ๋ฅ๋ณ๋ก ์ต๋ 1๊ฐ์ง ์์๋ง ์ฐฉ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ์์์ ๊ฒฝ์ฐ ๋๊ทธ๋ ์๊ฒฝ๊ณผ ๊ฒ์ ์ ๊ธ๋ผ์ค๋ฅผ ๋์์ ์ฐฉ์ฉํ ์๋ ์์ต๋๋ค.
- ์ฐฉ์ฉํ ์์์ ์ผ๋ถ๊ฐ ๊ฒน์น๋๋ผ๋, ๋ค๋ฅธ ์์์ด ๊ฒน์น์ง ์๊ฑฐ๋, ํน์ ์์์ ์ถ๊ฐ๋ก ๋ ์ฐฉ์ฉํ ๊ฒฝ์ฐ์๋ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ท์ ์ฐฉ์ฉํ ๊ฒ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
- ์ฝ๋๋ ํ๋ฃจ์ ์ต์ ํ ๊ฐ์ ์์์ ์ ์ต๋๋ค.
์ฝ๋๊ฐ ๊ฐ์ง ์์๋ค์ด ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด clothes๊ฐ ์ฃผ์ด์ง ๋ ์๋ก ๋ค๋ฅธ ์ท์ ์กฐํฉ์ ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- clothes์ ๊ฐ ํ์ [์์์ ์ด๋ฆ, ์์์ ์ข ๋ฅ]๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ์ฝ๋๊ฐ ๊ฐ์ง ์์์ ์๋ 1๊ฐ ์ด์ 30๊ฐ ์ดํ์ ๋๋ค.
- ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์์์ ์กด์ฌํ์ง ์์ต๋๋ค.
- clothes์ ๋ชจ๋ ์์๋ ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ๋ชจ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ 1 ์ด์ 20 ์ดํ์ธ ์์ฐ์์ด๊ณ ์ํ๋ฒณ ์๋ฌธ์ ๋๋ '_' ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
clothes | return |
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
๋ฌธ์ ํ์ด
๋์ ํ์ด
import Foundation
func solution(_ clothes:[[String]]) -> Int {
var clothesDic = [String:Int]()
clothes.forEach{ clothesDic[$0[1]] = ( clothesDic[$0[1]] ?? 0 ) + 1 }
return clothesDic.values.reduce(1) { $0 * ($1 + 1) } - 1
}
๋ณด์๋ง์ ๋์ ๋๋ฆฌ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
์ฒ์์๋ ๋์ ๋๋ฆฌ๋ฅผ [String: [String]]์ผ๋ก ์ ์ํ์ฌ [์์์ ์ข ๋ฅ: [์์์ ์ด๋ฆ]] ( ์์์ ์ข ๋ฅ์ ๋ฐ๋ฅธ ์์์ ์ด๋ฆ ๋ฐฐ์ด )์ ๋ด์๋ค. ํ์ง๋ง, ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ๊ตณ์ด ์์์ ์ด๋ฆ ๋ฐฐ์ด์ด ์๋ ์์์ ์ข ๋ฅ์ ๋ฐ๋ฅธ ์์ ๊ฐฏ์๋ง ๋ค์ด๊ฐ๋ ๋๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ , [String:Int]๋ก ๋ณ๊ฒฝํ๋ค.
์์์ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์ฌ์ ๋ค. ๊ณฑ์ ๋ฒ์น์ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ๊ณผ ๋์ผํ๋ค. ์์ท 2๋ฒ, ์๋์ท 3๋ฒ์ด ์์ ๊ฒฝ์ฐ์ ์ท์ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๊ฐ 23์ด๋ฏ๋ก 6์ด๋ค. ์์ ๋ฌธ์ ๋ ์์ท์ ์์ ์์๋ ์๋์ท์ ์์ ์ ์๋ ์๋ค๋ ๊ฐ์ ์ด ๋ด์ ๋์ด ์๊ธฐ ๋๋ฌธ์ (2+1)(3+1)์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์๋ค. ํ์ง๋ง, ๋ฌด์กฐ๊ฑด ์ท์ ํ ๊ฐ ์ด์์ ์ ์ด์ผํ๋ค๋ ๊ฐ์ ์ด ์๊ธฐ ๋๋ฌธ์ ํ๋๋ฅผ ๋นผ์ค๋ค.
๋ค๋ฅธ ์ฌ๋ ํ์ด
import Foundation
func solution(_ clothes:[[String]]) -> Int {
let types = clothes.compactMap({ $0.last })
let typeSet = Set(types)
let categories = Array(typeSet)
let counts = categories.map({ category in
return clothes.filter({ $0.last == category }).count + 1
})
return counts.reduce(1, { $0 * $1 }) - 1
}
let types = clothes.compactMap({ $0.last })
// ["headgear", "eyewear", "headgear"]
let typeSet = Set(types) // ์ค๋ณต๊ฐ ์ ๊ฑฐ
// ["headgear", "eyewear"]
let categories = Array(typeSet) // ๋ค์ array๋ก ๋ณํ
// ["headgear", "eyewear"]
์์ ๊ณผ์ ์ ํตํด ์์์ ์ข ๋ฅ ๋ฐฐ์ด์ ์ป๊ณ , ์ด ๋ฐฐ์ด์ ์ด์ฉํด ๊ฐ ์ข ๋ฅ์ ๋ฐ๋ฅธ ์ท์ ๊ฐฏ์๋ฅผ map๊ณผ filter๋ฅผ ํตํด ๊ตฌํ์๋ค. ๊ฒฝ์ฐ์์๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์ ๋๋ ๋์ผํ๋ค.
์์ ํ์ด๋ฅผ ์์ถ์ํจ๋ค๋ฉด ์๋์ ํ์ด๊ฐ ๋ ๊ฒ์ด๋ค.
func solution(_ clothes:[[String]]) -> Int {
let counts = Set(clothes.compactMap({ $0.last })).map({ category in
return clothes.filter({ $0.last == category }).count + 1
})
return counts.reduce(1, { $0 * $1 }) - 1
}
๐ค ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ ๋ฐฐ์ด์ด ๋น ๋ฅผ๊น ๋์ ๋๋ฆฌ๊ฐ ๋น ๋ฅผ๊น…?
๋์ ํ์ด์ธ ๋์ ๋๋ฆฌ๊ฐ ๋น ๋ฅด๋ค๋ ํ๋จ์ ํ๋ค.
๋ฐฐ์ด๋ก ํธ๋ ๊ณผ์ ์์ filter ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด ๊ฐ ์์์ ๋ํ ์คํ์ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๊ฐ ๋์์ง๋ค. ๋ํ ๋งค๋ฒ filtering์ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ๊ณ์ฐ์ด ๋ง์์ง๋ค. ๊ฐ ์ข ๋ฅ๋ง๋ค ๋ชจ๋ ๋ฐฐ์ด์ ๋ค์ ํ๋ฒ๋ ๊ฒ์์ ํด์ผํ๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๊ทธ์ ๋น์ ๋์ ํ์ด์ธ ๋์ ๋๋ฆฌ๋ clothes๋ฅผ ๊ด์ฐฐํ์ฌ ๋ฑ ํ๋ฒ์ O(n) ๊ณผ์ ์ผ๋ก ๋์ ๋๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.