Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

Algorithm/Baekjoon

[λ°±μ€€] (Swift) 17427번 - μ•½μˆ˜μ˜ ν•©2

감자 πŸ₯” 2022. 12. 23. 11:45
λ°˜μ‘ν˜•

 

🟠 문제

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

 

17427번: μ•½μˆ˜μ˜ ν•© 2

두 μžμ—°μˆ˜ A와 Bκ°€ μžˆμ„ λ•Œ, A = BCλ₯Ό λ§Œμ‘±ν•˜λŠ” μžμ—°μˆ˜ Cλ₯Ό A의 μ•½μˆ˜λΌκ³  ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 2의 μ•½μˆ˜λŠ” 1, 2κ°€ 있고, 24의 μ•½μˆ˜λŠ” 1, 2, 3, 4, 6, 8, 12, 24κ°€ μžˆλ‹€. μžμ—°μˆ˜ A의 μ•½μˆ˜μ˜ 합은 A의 λͺ¨λ“  μ•½μˆ˜λ₯Ό 더

www.acmicpc.net

μ•„λ‹ˆ λ‚΄κ°€ λ¬Έν•΄λ ₯이 μ§„μ§œ λ”Έλ¦¬λŠ”κ±΄κ°€? 문제 이해가 잘 μ•ˆλΌ γ…‹γ…‹γ…‹γ…‹ 어쨋든 이것도 문제 μ„Έλ²ˆμ •λ„ μ •λ…ν•˜κ³  문제 이해 μ™„λ£Œν•˜κ³  ν’€μ΄μ‹œμž‘

🟠 1차원적인 μ•½μˆ˜κ΅¬ν•΄μ„œ λ”ν•˜λŠ” 풀이, μ‹œκ°„μ΄ˆκ³Ό

πŸ”– λ‹Ήμ—°νžˆ μ‹œκ°„μ΄ˆκ³Ό λ‚˜κ² λŠ”λ°?

λ‹Ήμ—°ν•˜κ²Œ μƒκ°ν•œ 1차원적 풀이가, N보닀 μž‘μ€ 수의 λͺ¨λ“  μ•½μˆ˜λ₯Ό κ΅¬ν•΄μ„œ 합을 κ΅¬ν•˜λ©΄ λ˜κ² κ΅¬λ‚˜ μƒκ°ν–ˆλ‹€. 그러고 μ΄λ ‡κ²Œ ν•˜λ©΄ 이쀑for문이 λ“€μ–΄κ°€κ²Œ 되고, sum을 ν•˜λŠ” κ³Όμ •μ—μ„œ 또 for문이 λ“€μ–΄κ°€λŠ”λ°, μ‹œκ°„μ΄ˆκ³Όκ°€ μ•ˆλ‚ κΉŒ? ν•˜κ³  λ²”μœ„λ₯Ό μ‚΄νŽ΄λ΄€λŠ”λ°,, N의 λ²”μœ„λŠ”,,,,μ΅œλŒ€ 100만...! λ§λ„μ•ˆλΌ, 이쀑for문이 λŒμ•„κ°€μ„œ 100만 * 100만이면,,, μ–΄μš° 상상도 ν•˜κ³  싢지 μ•Šμ€ 루프가 μƒμ„±λœλ‹€.

import Foundation

private func solution() -> Int {
    let N = Int(readLine()!)!
    var sum = 0

    for i in 1..<N+1 {
        var div = [Int]()
        for j in 1..<i+1 {
            if i == j {
                div.append(i)
                break
            }
            if i % j == 0 {
                div.append(j)
            }
        }
        for d in div {
            sum += d
        }
    }
    return sum
}

print(solution())

μœ„μ²˜λŸΌ ν’€μ—ˆκ³ , λ‹Ήμ—°ν•˜κ²Œ μ‹œκ°„μ΄ˆκ³Όκ°€ 났닀. μ‹€μ œλ‘œ xcode λ‘œμ»¬μ—μ„œ λŒλ €λ³΄λŠ”λ°λ„ 10000이 듀어가도 μ—„μ²­λ‚œ μ‹œκ°„μ΄ μ†Œμš”λλ‹€. γ…‹γ…‹γ…‹γ…‹

자, 그럼 이제 λ‹€λ₯Έ κ·œμΉ™μ„ μ°Ύμ•„λ³΄μž, for문을 μ΅œμ†Œν™”ν•˜κ³ , κ΅¬ν•΄μ•Όν•œλ‹€.

🟠 이런 것은 μˆ˜ν•™μ μΈ 츑면으둜 λ‹€κ°€κ°€μ•Όν•΄!

λ°”λ‘œ λ– μ˜€λ₯΄μ§€ μ•Šμ•„μ„œ N=10 μΌλ•Œλ₯Ό μ „λΆ€ μ μ–΄λ³΄μ•˜λ‹€. μ—¬κΈ°μ„œ g(N)을 κ΅¬ν•˜λ €λ©΄, 1은 10개, 2λŠ” 5개, 3은 3개, 4λŠ” 2개,, μ΄λ ‡κ²Œ λ‚˜μ™”λ‹€. κ·œμΉ™μ„ 찾아보면? 10을 1둜 λ‚˜λˆˆ λͺ«μ„ 1에 κ³±ν•΄μ£Όκ³ , 10을 2둜 λ‚˜λˆˆ λͺ«μ„ 2에 κ³±ν•΄μ£Όκ³ , 10을 3으둜 λ‚˜λˆˆ λͺ«μ„ 3에 κ³±ν•΄μ£Όκ³ ,, μ „λΆ€ 더해주면 g(N)이 λ‚˜μ˜€λŠ” 것이닀. μ™œ 이런 κ·œμΉ™μ΄ λ‚˜μ˜¬κΉŒ?

λ°”λ‘œ, μ•„λž˜μ™€ 같은 κ·œμΉ™ λ•Œλ¬Έμ΄μ—ˆλ‹€.

1의 λ°°μˆ˜λŠ” 항상 1을 μ•½μˆ˜λ‘œ κ°–λŠ”λ‹€
2의 λ°°μˆ˜λŠ” 항상 2λ₯Ό μ•½μˆ˜λ‘œ κ°–λŠ”λ‹€
3의 λ°°μˆ˜λŠ” 항상 3을 μ•½μˆ˜λ‘œ κ°–λŠ”λ‹€
4의 λ°°μˆ˜λŠ” 항상 4λ₯Ό μ•½μˆ˜λ‘œ κ°–λŠ”λ‹€
...
10의 λ°°μˆ˜λŠ” 항상 10을 μ•½μˆ˜λ‘œ κ°–λŠ”λ‹€.
N의 λ°°μˆ˜λŠ” 항상 N을 μ•½μˆ˜λ‘œ κ°–λŠ”λ‹€.

이 κ·œμΉ™ λ•Œλ¬Έμ΄μ—ˆλ‹€. κ·Έλž˜μ„œ 1의 λ°°μˆ˜κ°€ 10내뢀에 10κ°œλ‹ˆκΉŒ, 1을 10개 κ°–λŠ” 것이고, 2의 λ°°μˆ˜λŠ” 10 내뢀에 5κ°œλ‹ˆκΉŒ, 2λ₯Ό 5개 κ°–λŠ” κ²ƒμ΄μ—ˆλ‹€. 이 κ·œμΉ™μ„ μ‚¬μš©ν•˜λ©΄ for문은 ν•œλ²ˆλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. 즉, O(N) 의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 정닡을 ꡬ할 수 μžˆλ‹€.

🟠 μ •λ‹΅

private func solution() -> Int {
    let N = Int(readLine()!)!
    var sum = 0

    for i in 1..<N+1 {
        sum += (N / i) * i
    }

    return sum
}

print(solution())
λ°˜μ‘ν˜•