λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’― | λ°±μ€€/πŸ™‚ | Silver

[Kotlin, S4] λ°±μ€€ 25184번 λ™κ°€μˆ˜μ—΄ κ΅¬ν•˜κΈ°

by immgga 2024. 8. 1.

좜처: unsplash.com

 

λ™κ°€μˆ˜μ—΄ κ΅¬ν•˜κΈ°(25184번)

Silver 4

#ν•΄ κ΅¬μ„±ν•˜κΈ°

 

문제 λ‚΄μš©

 

 

문제 μ ‘κ·Ό

문제의 λ™κ°€μˆ˜μ—΄μ—λŠ” 2κ°€μ§€μ˜ 쑰건을 λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

1. 1λΆ€ν„° NκΉŒμ§€μ˜ 수λ₯Ό 가지고 μ€‘λ³΅λ˜λ©΄ μ•ˆ λœλ‹€.

2. μ–‘μ˜†μ˜ μ›μ†Œμ˜ μ°¨μ΄λŠ” N / 2 이상이닀(N이 4인 경우: [2, 4, 6...].

 

μœ„ 쑰건을 λ§Œμ‘±ν•˜λ©΄μ„œ μˆ˜μ—΄μ„ κ΅¬μ„±ν•˜λ €λ©΄ μž‘μ€ μˆ˜λΆ€ν„° μ‹œμž‘ν•΄ 큰 μˆ˜κΉŒμ§€ N / 2둜 λ”ν•΄κ°€λ©΄μ„œ μˆ˜μ—΄μ„ κ΅¬μ„±ν•œλ‹€.

7을 μ˜ˆμ‹œλ‘œ λ“€μ–΄ 보겠닀.

사진 1-1

 

7을 예둜 λ“€λ©΄ 1~7κΉŒμ§€ μ›μ†Œλ‘œ κ΅¬μ„±λ˜μ–΄μ•Ό ν•˜κ³ , 각 μ›μ†Œμ˜ μ°¨μ΄λŠ” 7 / 2에 μ†Œμˆ˜μ μ„ 버린 3이닀.

처음 μ‹œμž‘κ°’μ„ μ›μ†Œ μ°¨μž‡κ°’μœΌλ‘œ μ‹œμž‘ν•œλ‹€(N / 2).

3λΆ€ν„° μ‹œμž‘ν•΄ 3μ”© 더해가면 3, 6 μˆœμ„œλŒ€λ‘œ μˆ˜μ—΄μ— κ΅¬μ„±λœλ‹€.

이 μˆ˜μ—΄μ€ 1번 쑰건은 λ§Œμ‘±ν•˜μ§€ μ•Šμ§€λ§Œ, 2번 쑰건을 λ§Œμ‘±ν•œλ‹€.

이 μˆ˜μ—΄μ— 2번 쑰건을 λ§Œμ‘±ν•˜λ©΄μ„œ 1번 쑰건을 λ§Œμ‘±ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같이 μˆ˜μ—΄μ΄ κ΅¬μ„±λ˜μ–΄μ•Ό ν•œλ‹€.

사진 1-2

 

이 κ²°κ³Όλ₯Ό 보고 원리λ₯Ό 깨우친 뢄듀은 λˆˆμΉ˜κ°€ λΉ λ₯΄μ‹  κ±°λ‹€. λ°”λ‘œ κ΅¬ν˜„ν•˜λŸ¬ κ°€μ‹œλ©΄ λœλ‹€.

 

μœ„ μˆ˜μ—΄μ˜ μ›λ¦¬λŠ” μ‹œμž‘κ°’(3)을 μ‹œμž‘μœΌλ‘œ μ‹œμž‘κ°’μ„ λ”ν•΄κ°€λ©΄μ„œ μˆ˜μ—΄μ— λ„£λ‹€κ°€ 7보닀 값이 컀지면

μ‹œμž‘κ°’μ—μ„œ - 1을 λΊ€ 만큼 μ‹œμž‘κ°’μ„ μž¬κ΅¬μ„±ν•΄ λ‹€μ‹œ 3(N / 2)만큼 더해 μ£ΌλŠ” 것이닀.

사진 1-3

 

μ‹œμž‘κ°’μ„ 점차 λΉΌ κ°€λ©΄μ„œ 7을 λ„˜μ§€ μ•Šλ„λ‘ 계속 N / 2λ₯Ό 더해 μ£ΌλŠ” 것이닀.

μ‹œμž‘κ°’μ΄ 3: 3 => 6

μ‹œμž‘κ°’μ΄ 2: 2 => 5

μ‹œμž‘κ°’μ΄ 1: 1 => 4 => 7

μœ„ 값듀을 μˆœμ„œλŒ€λ‘œ μˆ˜μ—΄μ— λ„£μ–΄μ£Όλ©΄ 1, 2번 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ” μˆ˜μ—΄μ΄ λœλ‹€.

 

 

문제 ν•΄κ²° μ½”λ“œ

더보기
import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val size = readLine().toInt()
    val sequence = mutableListOf<Int>()

    if (size == 1) {
        println(1)
        return
    }

    for (i in 0 until size) {
        var addValue = size / 2 - i

        while (addValue <= size && sequence.size < size) {
            sequence.add(addValue)
            addValue += size / 2
        }
    }

    println(sequence.joinToString(" "))
}

 

문제 풀이

μˆ˜μ—΄μ„ μ €μž₯ν•  listλ₯Ό μƒμ„±ν•œλ‹€.

초기의 μ‹œμž‘κ°’μ„ 반볡문 μ•ˆμ— addValue둜 μ •μ˜ν•œλ‹€.

var addValue = size / 2 - i

이 값은 7둜 예λ₯Ό λ“€λ©΄ μ²˜μŒμ—λŠ” 3으둜 μ‹œμž‘(iλŠ” 0)ν•˜λ‹€κ°€

λ°˜λ³΅λ˜λ©΄μ„œ μ¦κ°€λœ 값을 μ΄ˆκΈ°ν™”ν•˜λ©΄μ„œ 값이 1μ”© 쀄어듀기 μ‹œμž‘ν•  것이닀(2일 λ•ŒλŠ” iλŠ” 1).

 

addValueκ°€ μˆ˜μ—΄μ˜ μ΅œλŒ“κ°’μ„ λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ, μˆ˜μ—΄μ˜ sizeκ°€ μ΅œλŒ“κ°’λ³΄λ‹€ μž‘μ•„μ•Ό ν•œλ‹€.

while (addValue <= size && sequence.size < size)

값을 μˆ˜μ—΄μ— μΆ”κ°€ν•˜κ³  addValueλ₯Ό μ΅œλŒ“κ°’μ˜ / 2만큼 μ¦κ°€μ‹œν‚¨λ‹€.

 

 

문제 ν•΄κ²° κ³Όμ •

쑰금만 생각해 보면 μ‰½κ²Œ κ·œμΉ™μ„ νŒŒμ•…ν•  수 μžˆλ‹€.

예제 2λ₯Ό μ°Έκ³ ν•΄ λ‹€λ₯Έ 수일 경우의 정닡을 적어 보면 원리λ₯Ό νŒŒμ•…ν•  수 μžˆμ„ 것이닀.

728x90