๋ฒ ์คํธ์จ๋ฒ
Level 3
https://school.programmers.co.kr/learn/courses/30/lessons/42579
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ์ฅ๋ฅด๋ณ๋ก 2๊ฐ์ฉ ๋ชจ์์ ๊ฐ ๋ ธ๋์ ๊ณ ์ ๋ฒํธ๋ฅผ ์์๋๋ก ์ถ๋ ฅํด์ผ ํ๋ค.
๋ฌธ์ ์ ์์ ๋ฅผ ํ๋ก ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ ๋ ฅ๋ ์์๋๋ก ๊ณ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ธ๋์ ์ฅ๋ฅด์ ์ฌ์ ํ์๊ฐ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ฅ๋ฅด์ ์ฌ์ ํ์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋์ผํ ๊ฒ๋ผ๋ฆฌ๊ฐ ํ ๋ ธ๋์ ํต๊ณ๊ฐ ๋ ๊ฒ์ด๋ค.
๋ฌธ์ ์์ ์๊ตฌํ ์กฐ๊ฑด๋๋ก ์ฐ์ ์ ์ผ๋ก ์ ๋ ฌํด ์ค ๋ค์ ๊ณ ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ์.
1. ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด
2. ์ฅ๋ฅด ๋ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋
3. ์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ผ๋ฉด ๊ณ ์ ๋ฒํธ๊ฐ ์์ ๋ ธ๋
์ ์กฐ๊ฑด๋ค์ ์์๋๋ก ์ ์ฉ์์ผ์ ์์๋ฅผ ๋ณ๊ฒฝ์ํค๋ฉด ์๋์ ๊ฐ๋ค.
๊ฐ์ฅ ์ฌ์ ํ์๊ฐ ๋ง์ pop(3100)์ ๊ฐ์ฅ ์๋จ์ ๋ฐฐ์นํ๋ค.
๊ทธ๋ค์ pop ๋ ธ๋ ์ค ๊ฐ์ฅ ์ฌ์ ํ์๊ฐ ๋ง์ ์์๋๋ก ์ ๋ ฌํด ์ค๋ค.
๋ค๋ฅธ ์ฅ๋ฅด๋ค์ ๋ ธ๋๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฌํด ์ฃผ๋ฉด ์ฌ์ง 1-2์ฒ๋ผ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ฒ ์คํธ์จ๋ฒ์ ๋ฑ์ฌ๋๊ธฐ ์ํด์๋ ์ฅ๋ฅด์์ ๋ ธ๋ 2๊ฐ์ฉ์ ๋ฝ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์์๊ฐ ๋ฐ๋ฆฌ๋ classic์ 2๋ฒ ๋ ธ๋๋ฅผ ์ ์ธํ๊ณ ๋ ธ๋์ ๊ณ ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทธ๋ฌ๋ฉด 4, 1, 3, 0์ด ๋ ๊ฒ์ด๋ค.
์ฝ๋๋ก ๊ตฌํํ๊ธฐ ์ํด์๋ ์ฐ์ ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ํ์๋ฅผ ๋ด์ Map์ ์์ฑํด์ ๊ฐ ๋ ธ๋์ ์ฌ์ ํ์๊ฐ ๋ค์ด์ค๋ฉด ๊ฐ ์ฅ๋ฅด์ ๋ง๊ฒ ๊ฐ์ ์ถ๊ฐํด ์ค์ผ ํ๋ค.
// ํค๊ฐ ์๋ ๊ฒฝ์ฐ
musicPlay[genresType] = play
// ํค๊ฐ ์๋ ๊ฒฝ์ฐ
musicPlay[genresType] = musicPlay[genresType]!! + play
ํค๊ฐ ์์ผ๋ฉด ์ด๊ธฐ๊ฐ์ play๋ก ์๋กญ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ , ํค๊ฐ ์์ผ๋ฉด ๊ธฐ์กด ๋ฐ์ดํฐ์ play๋ฅผ ๋ํด ์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ธ๋์ ์ฅ๋ฅด, ๊ณ ์ ๋ฒํธ. ์ฌ์ ํ์๋ฅผ ๋ด์ Map์ ๋ง๋ค์ด์ key๋ฅผ ์ฅ๋ฅด๋ก ์ก๊ณ , value๋ฅผ ํ์ Map์ ๊ตฌ์ฑํด key๋ฅผ ๊ณ ์ ๋ฒํธ, value๋ฅผ ์ฌ์ ํ์๋ฅผ ๋ด์ ์ค๋ค.
๋ํ ํ ์ฅ๋ฅด์ ๋ ธ๋๊ฐ ์ต๋ 2๊ฐ๊น์ง ์๋ก๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ์ด๋ฏธ 2๊ฐ๊ฐ ์ ์ฅ๋์ด ์์ผ๋ฉด ์ฌ์ ํ์๊ฐ ์ต์๊ฐ์ด ๊ฐ์ key๋ฅผ ๊ตฌํด์ ์ต์๊ฐ๋ณด๋ค ํ์ฌ ๋ ธ๋์ ์ฌ์ ํ์๊ฐ ํฐ์ง ํ์ธํ๋ค.
Map์์ ์ต์๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
val minPlays = music[genresType]!!.minOf { it.value }
์ด ์ต์๊ฐ๊ณผ ํ์ฌ ์ฌ์ ํ์๋ฅผ ๋น๊ตํ๋ ์กฐ๊ฑด์ minPlays < play์ด๋ค.
๋ค์์ผ๋ก๋ ์ฅ๋ฅด๋ณ๋ก ์ฌ์ ํ์๊ฐ ๋ง์ ์์๋๋ก ์ ๋ ฌํด์ฃผ์ด์ผ ํ๋ค.
๋ ธ๋ ์ฌ์ ํ์๊ฐ ํฐ ์์๋๋ก ์ ๋ ฌํด ์ฃผ๋ ๋ฐฉ๋ฒ์ Kotlin์์๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
Map์์ ์ ๋ ฌ์ LinkedList์ Map.entries์ ๋ฃ๊ณ sort ํจ์๋ฅผ ์ํํด ์ฃผ๋ฉด ๋๋ค.
val musicPlayEntries = LinkedList(musicPlay.entries)
musicPlayEntries.sortByDescending { it.value }
์ ๋ ฌ๋ ์ฅ๋ฅด๊ฐ์ key๋ก ๋ฐ๋ map์ ์ฌ์ ํ์(value)๋ค๋ผ๋ฆฌ ํฐ ์์๋๋ก ์ ๋ ฌ์ ํด์ฃผ๊ณ , ์ ๋ ฌ ๊ฒฐ๊ณผ์ key๋ฅผ ๋ถ๋ฌ์ค๋ฉด ์ ๋ต์ด ๋๋ค.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
fun solution(genres: Array<String>, plays: IntArray): IntArray {
val answer = mutableListOf<Int>()
val music = mutableMapOf<String, MutableMap<Int, Int>>()
val musicPlay = mutableMapOf<String, Int>() // ์ด ์ฌ์ ํ์
for (i in genres.indices) {
val genresType = genres[i]
val play = plays[i]
if (!music.containsKey(genresType)) {
music[genresType] = mutableMapOf(i to play)
musicPlay[genresType] = play
} else {
musicPlay[genresType] = musicPlay[genresType]!! + play
if (music[genresType]!!.size < 2) {
music[genresType]?.set(i, play)
} else {
val minPlays = music[genresType]!!.minOf { it.value }
if (minPlays < play) {
val minIndex = music[genresType]!!.values.indexOf(minPlays)
val minKey = music[genresType]!!.keys.toList()[minIndex]
music[genresType]?.remove(minKey)
music[genresType]?.set(i, play)
}
}
}
}
val musicPlayEntries = LinkedList(musicPlay.entries)
musicPlayEntries.sortByDescending { it.value }
for (i in 0 until musicPlayEntries.size) {
val key = musicPlayEntries[i].key
val musicInfo = LinkedList(music[key]!!.entries)
musicInfo.sortByDescending { it.value }
for (m in musicInfo) {
answer.add(m.key)
}
}
return answer.toIntArray()
}
๋ฌธ์ ํ์ด
๋ ธ๋์ ์ฅ๋ฅด, ๊ณ ์ ๋ฒํธ, ์ฌ์ ํ์๋ฅผ ์ ์ฅํ map(music)๊ณผ ๋ ธ๋์ ์ฅ๋ฅด์ ์ด ์ฌ์ ํ์๋ฅผ ์ ์ฅํ map(musicPlay)์ ์์ฑํ๊ณ
์ฒ์์ map๋ค์ด ๋น์ด ์์ ๋๋ key๋ฅผ genresType์ผ๋ก ์ค์ ํด ์ด๊ธฐํํด ์ค๋ค.
map์ key ๊ฐ์ด ๋ค์ด ์์ผ๋ฉด, ์ต๋๊ฐ map์ ๊ฐ์ ๊ณ์ ์ฅ๋ฅด๋ง๋ค ๋ํด์ฃผ๋ฉด ๋๊ณ ,
music์ ๊ฒฝ์ฐ์๋ ์ ์ฅ๋ ๋ ธ๋์ ๊ฐ์๊ฐ 2๊ฐ๋ฅผ ๋์ผ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ฌ์ ํ์์ ์ต์๊ฐ์ ์ฐพ์ ํด๋น ๊ฐ์ key๋ฅผ ์ฐพ์ ์ค๋ค.
val minPlays = music[genresType]!!.minOf { it.value }
์ต์๊ฐ์ด ํ์ฌ ์ฌ์ ํ์๋ณด๋ค ์์ ๊ฒฝ์ฐ์๋ง ์ํํด ์ค๋ค.
์ต์๊ฐ์ด ๋ค์ด ์๋ index๋ฅผ ์ฐพ๊ฒ ๋๋ฉด, map์ key๋ค์ด ์๋ list์์ index์ ํด๋น๋๋ key์ ๊ฐ์ด ์ญ์ ํด์ผ ํ key๊ฐ ๋๋ค.
val minIndex = music[genresType]!!.values.indexOf(minPlays)
val minKey = music[genresType]!!.keys.toList()[minIndex]
music[genresType]?.remove(minKey)
music[genresType]?.set(i, play)
๋ง์ง๋ง์๋ ์ ๋ ฌ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ฐ์ ์ ๋ ฌํ๋ ค๊ณ ํ๋ map์ LinkedList๋ก ๋ฐ์ ์ฃผ๊ณ , ์ด ์ฌ์ ํ์ ์์ผ๋ก ๊ฐ์ ์ ๋ ฌํ๋ค.
๋ค์ musicPlay์ key(์ฅ๋ฅด)๋ฅผ music์ ์ด์ฉํด ํ์ map๋ ์ ๋ ฌ์ ํด์ค๋ค.
์ ๋ ฌ๋ ๊ฒฐ๊ณผ์์ key๋ฅผ answer์ ์ถ๊ฐํด ์ค๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
map์ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
๋์ ๊ฒฝ์ฐ์๋ ์ด ์ฌ์ ํ์์ ์ฅ๋ฅด๋ณ ๋ ธ๋๋ฅผ ๊ฐ๊ฐ์ map์ผ๋ก ์์ฑํด์ ๊ตฌํํ๋๋ฐ, ํ๋๋ก ํ์ผ๋ฉด ์๋นํ map์ด ๋ณต์กํด์ก์ ๊ฒ ๊ฐ๋ค.
map์์ key์ value ์ฐธ์กฐ ๋ฐ map์์์ ์ ๋ ฌ์ ์ฐ์ตํด ๋ณผ ์ ์๋ ๋ฌธ์ ์๋ค.
'๐ | ํ๋ก๊ทธ๋๋จธ์ค > ๐ | Level 3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, Lv.3] ํ๋ก๊ทธ๋๋จธ์ค ์ ๊ตญ์ฌ์ฌ (0) | 2024.08.07 |
---|---|
[Kotlin, Lv.3] ํ๋ก๊ทธ๋๋จธ์ค ๋คํธ์ํฌ (0) | 2024.08.06 |