๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Ÿ | ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿ˜  | Level 3

[Kotlin, Lv.3] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

by immgga 2024. 7. 31.

์ถœ์ฒ˜: unsplash.com

 

๋ฒ ์ŠคํŠธ์•จ๋ฒ”

Level 3

https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

๋ฌธ์ œ ๋‚ด์šฉ

 

 

๋ฌธ์ œ ์ ‘๊ทผ

๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ์žฅ๋ฅด๋ณ„๋กœ 2๊ฐœ์”ฉ ๋ชจ์•„์„œ ๊ฐ ๋…ธ๋ž˜์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ์˜ ์˜ˆ์ œ๋ฅผ ํ‘œ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์‚ฌ์ง„ 1-1

์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋…ธ๋ž˜์˜ ์žฅ๋ฅด์™€ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ์žฅ๋ฅด์™€ ์žฌ์ƒ ํšŸ์ˆ˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ๋™์ผํ•œ ๊ฒƒ๋ผ๋ฆฌ๊ฐ€ ํ•œ ๋…ธ๋ž˜์˜ ํ†ต๊ณ„๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

 

๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•œ ์กฐ๊ฑด๋Œ€๋กœ ์šฐ์„ ์ ์œผ๋กœ ์ •๋ ฌํ•ด ์ค€ ๋‹ค์Œ ๊ณ ์œ  ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜์ž.

1. ๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ์žฅ๋ฅด

2. ์žฅ๋ฅด ๋‚ด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜

3. ์žฅ๋ฅด ๋‚ด์—์„œ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๋…ธ๋ž˜

์œ„ ์กฐ๊ฑด๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ์‹œ์ผœ์„œ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์‚ฌ์ง„ 1-2

๊ฐ€์žฅ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๋งŽ์€ 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์—์„œ์˜ ์ •๋ ฌ์„ ์—ฐ์Šตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

728x90