๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ | ๋ฐฑ์ค€/๐Ÿ™‚ | Silver

[Kotlin, S3] ๋ฐฑ์ค€ 2346๋ฒˆ ํ’์„  ํ„ฐ๋œจ๋ฆฌ๊ธฐ

by immgga 2024. 8. 19.

์ถœ์ฒ˜: unsplash.com

 

ํ’์„  ํ„ฐ๋œจ๋ฆฌ๊ธฐ(2346๋ฒˆ)

Silver 3

#์ž๋ฃŒ ๊ตฌ์กฐ #๋ฑ

https://www.acmicpc.net/problem/2346

 

๋ฌธ์ œ ๋‚ด์šฉ

 

 

๋ฌธ์ œ ์ ‘๊ทผ

์ž…๋ ฅ ์ˆœ์„œ๋Œ€๋กœ ํ’์„  ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ์ข…์ด์— ์ ํ˜€ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๊ณ , ์ข…์ด์— ์ž…๋ ฅ๋œ ์ˆ˜๋งŒํผ ์ด๋™ํ•ด์„œ ๋‹ค๋ฅธ ํ’์„ ์„ ํ„ฐ๋œจ๋ ค์•ผ ํ•œ๋‹ค. ์ข…์ด์˜ ์ˆซ์ž๊ฐ€ ์–‘์ˆ˜๋ฉด ๋‹ค์Œ ๋ฒˆํ˜ธ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๊ณ , ์Œ์ˆ˜๋ฉด ์ด์ „ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ธ๋‹ค. ํ„ฐ์ง„ ํ’์„ ์— ์“ฐ์ธ ์ข…์ด๋Š” ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ž…๋ ฅ ์˜ˆ์ œ 1์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๋ฉด

5
3 2 1 -3 -1

1๋ฒˆ์งธ ํ’์„ ์ธ ์ข…์ด์— 3์ด ์ ํžŒ ํ’์„ ์„ ํ„ฐ๋œจ๋ ธ์œผ๋ฉด, ์–‘์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— 4๋ฒˆ์งธ ํ’์„ ์„ ํ„ฐ๋œจ๋ ค์•ผ ํ•œ๋‹ค. 4๋ฒˆ์งธ ํ’์„ ์€ ์Œ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. 2๊นŒ์ง€ ์ด๋™ํ–ˆ์œผ๋ฉด 2๋ฒˆ ์ด๋™ํ•œ ๊ฒƒ์ด๋‹ค. 2 ์ด์ „์˜ ๊ฐ’์ธ 3์€ ์ด๋ฏธ ํ„ฐ์ ธ์„œ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋•Œ๋Š” -1๋กœ ์ด๋™ํ•œ๋‹ค. ํ’์„ ์ด ์›ํ˜•์œผ๋กœ ๋†“์—ฌ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์„œ ํ’์„ ์„ ํ„ฐ๋œจ๋ ค ์ค€๋‹ค.

 

ํ’์„ ์ด ์›ํ˜•์œผ๋กœ ๋†“์—ฌ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ArrayDeque๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด 4MB์ด๋‹ค. ArrayDeque๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค(๊ฒฝํ—˜๋‹ด). ArrayDeque๊ฐ€ ์™œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š”์ง€๋Š” ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์—์„œ๋Š” ArrayDeque๋ฅผ ์“ธ ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•˜๋”๋ผ.

https://www.acmicpc.net/board/view/140376

 

์ด๋Ÿด ๋•Œ๋Š” ArrayDeque์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” MutableList๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

ํ’์„  ์•ˆ์˜ ์ข…์ด์˜ ์–‘์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ฌด์กฐ๊ฑด 1๋ฒˆ์งธ ํ’์„ ์ด ํ„ฐ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ฒซ ์ถœ๋ ฅ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ข…์ด์— 0์ด ์ ํžˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

List๋ฅผ ArrayDequeue์ฒ˜๋Ÿผ ํ™œ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์€ ์ฒซ index๋กœ ์˜ค๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

์ถœ๋ ฅํ•œ ๊ฒฐ๊ณผ๋Š” ์‚ญ์ œํ•œ๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

answer.append("${balloon.first().number} ")
popIndex = balloon.first().paper
balloon.removeAt(0)

balloon์ด ๋ชจ๋‘ ๋น ์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

popIndex๊ฐ€ ํ„ฐ์ง„ ํ’์„ ์— ์ ํ˜€์žˆ๋Š” ์ˆซ์ž ๋ฐ์ดํ„ฐ์ด๋‹ค.

 

<์กฐ๊ฑด 1>

popIndex๊ฐ€ ์–‘์ˆ˜์ด๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๋งจ ๋’ค๋กœ ๋ณด๋‚ด๋ฉด์„œ ์ˆœํšŒํ•˜๊ณ , ์Œ์ˆ˜์ด๋ฉด ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋งจ ์•ž์œผ๋กœ ๋ณด๋‚ด๋ฉด์„œ ์ˆœํšŒํ•œ๋‹ค.

if (popIndex != 0) {
    while (rotateCnt != abs(popIndex)) {
        if (popIndex > 0) {
            val first = balloon.first()
            balloon.removeFirst()
            balloon.add(first)
        } else {
            val last = balloon[balloon.lastIndex]
            balloon.removeLast()
            balloon.add(0, last)
        }

        rotateCnt++
    }
}

rotateCnt๋Š” ์›€์ง์ธ ํšŸ์ˆ˜์ด๋‹ค.

rotateCnt๊ฐ€ popIndex์˜ ์ ˆ๋Œ“๊ฐ’๊ณผ ๊ฐ™์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.StringTokenizer
import kotlin.math.abs

private data class Balloon(
    val number: Int,
    var paper: Int
)

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val balloon = mutableListOf<Balloon>()
    val cnt = readLine().toInt()
    val numbers = StringTokenizer(readLine())

    for (i in 0 until cnt) {
        balloon.add(Balloon(i + 1, numbers.nextToken().toInt()))
    }

    val answer = StringBuilder()
    var popIndex = 0
    while (balloon.isNotEmpty()) {
        var rotateCnt = if (popIndex > 0) 1 else 0

        if (popIndex != 0) {
            while (rotateCnt != abs(popIndex)) {
                if (popIndex > 0) {
                    val first = balloon.first()
                    balloon.removeFirst()
                    balloon.add(first)
                } else {
                    val last = balloon[balloon.lastIndex]
                    balloon.removeLast()
                    balloon.add(0, last)
                }

                rotateCnt++
            }
        }

        answer.append("${balloon.first().number} ")
        popIndex = balloon.first().paper
        balloon.removeAt(0)
    }

    println(answer)
}

 

๋ฌธ์ œ ํ’€์ด

ํ’์„ ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  data class๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ๋‹ค. MutableList์— ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค.

balloon list๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž…๋ ฅ๊ฐ’๊ณผ ๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•œ๋‹ค.

 

rotateCnt๋Š” ์–‘์ˆ˜์ผ ๋•Œ๋Š” 1๋กœ, ์Œ์ˆ˜์ผ ๋•Œ๋Š” 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ์ด์ „์— ๊ฐ’์ด ์ง€์›Œ์ง€๋ฉด์„œ 1์นธ ์•ž์œผ๋กœ ์˜ฎ๊ฒจ์ ธ ์ด๋ฏธ 1๋ฒˆ ์ด๋™ํ•œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— 1๋กœ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

rotateCnt๊ฐ€ popIndex์˜ ์ ˆ๋Œ“๊ฐ’๊ณผ ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค.

์ˆœํšŒ๊ฐ€ ๋๋‚˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฐ’์˜ ํ’์„  ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ข…์ด์— ์ ํžŒ ๊ฐ’์€ popIndex์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ์ง€์šด๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด 4MB์ธ ๋ฌธ์ œ, mutableList ๋•๋ถ„์— ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

index ์ด๋™์„ ์ž˜ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์“ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ๊ทธ๋ ‡๋“ฏ ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ์ด๋‹ค.

๋ฑ์„ ์“ฐ๋Š” ๋ฌธ์ œ์ธ๋ฐ Kotlin์œผ๋กœ๋Š” ArrayDeque๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ์•„์ด๋Ÿฌ๋‹ˆํ•œ ๋ฌธ์ œ.

728x90