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

Algorithm/Baekjoon

[λ°±μ€€] (Swift) 6588번 - κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘

감자 πŸ₯” 2022. 12. 27. 16:42
λ°˜μ‘ν˜•

 

μ•„μ•„ 아직도 μ‹œκ°„μ΄ˆκ³Όμ™€ μ‹Έμš°λŠ”μ€‘,, μ§€κΈˆμ€ 'μ‹œκ°„μ΄ˆκ³Ό 날거같은데..'ν•˜λ©΄μ„œ μ½”λ“œλ₯Ό 갈겨 μ“°κ³ μžˆλ‹€. ν•˜μ§€λ§Œ,,,,,,,, μ• μ΄ˆμ— 문제 풀이 μ‹œμž‘ν• λ•ŒλΆ€ν„° μ‹œκ°„μ΄ˆκ³Όμ— λŒ€ν•œ μƒκ°μ„ν•˜κ³  μ•Œκ³ λ¦¬μ¦˜μ„ μ§œλŠ”κ²Œ....λ§žλ‹€..백번 λ§žλ‹€. λ‚΄κ°€ 잘λͺ»ν•˜κ³  μžˆλŠ”κ²ƒμ΄λ‹€ γ… γ… 
ν•˜λ‚˜μ”© ν•΄κ²°ν•΄λ‚˜κ°€λ©΄μ„œ μ‹œκ°„μ΄ˆκ³Όμ˜ 원인을 μ°Ύμ•„ λ‚˜μ„œλ©΄, 점차,, μ΅μˆ™ν•΄μ§€κ² μ§€..?

 

🟠 문제

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

 

6588번: κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, n = a + b ν˜•νƒœλ‘œ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, a와 bλŠ” ν™€μˆ˜ μ†Œμˆ˜μ΄λ‹€. μˆ«μžμ™€ μ—°μ‚°μžλŠ” 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. λ§Œμ•½, n을 λ§Œλ“€ 수 μžˆλŠ” 방법이 μ—¬λŸ¬ 가지라면, b-aκ°€ κ°€μž₯ 큰

www.acmicpc.net

 

🟠 첫번째 풀이 - μ—­μ‹œλ‚˜ μ‹œκ°„μ΄ˆκ³Ό

private func solution() {
    let isprime = primeNumArr()
    var primeNum = [Int]()
    for i in 1..<isprime.count {
        if isprime[i] == true {
            primeNum.append(i)
        }
    }

    for _ in 0..<100000 {
        var flag = false
        let n = Int(readLine()!)!

        if n == 0 {
            break
        } else {
            flag = true
            for num in primeNum {
                if primeNum.contains(n - num) {
                    print("\(n) = \(num) + \(n-num)")
                    break
                }
            }
        }
        if !flag {
            print("Goldbach's conjecture is wrong.")
        }
    }
}

private func primeNumArr() -> [Bool] {
    var isprimenum = Array(repeating: true, count: 1000001)
    isprimenum[1] = false
    for i in 1..<1000001 {
        if isprimenum[i] == false {
            continue
        }

        for j in stride(from: i+i, through: 1000000, by: i) {
            isprimenum[j] = false
        }
    }
    return isprimenum
}

solution()

λ‚˜μ˜ 첫번째 풀이닀. μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚ κ±°κ°™λ‹€! ν•˜λ©΄μ„œ ν’€μ—ˆλ‹€. (.. 그럼.. ν’€μ§ˆλ§μ•˜μ–΄μ•Όμ§€)
μ‹œκ°„λ³΅μž‘λ„λŠ”,,, 이쀑 포문이 λ“€μ–΄κ°€μžˆλŠ”λ§ŒνΌ O(N^2)둜 μ˜ˆμƒλœλ‹€. μ–΄λ§ˆμ–΄λ§ˆν•˜λ‹€... μ–΄λŠ λΆ€λΆ„μ—μ„œ  νš¨μœ¨μ„ 높일 수 μžˆμ„κΉŒ?

 

🟠 λ‘λ²ˆμ§Έ 풀이 - λ§žμ•˜μŠ΅λ‹ˆλ‹€!

음,, 사싀 바꿔쀀건 λ³„λ‘œ μ—†λ‹€. κ·Έλž˜λ„ ν™•μ‹€νžˆ for루프 λŒμ•„κ°€λŠ” μ‹œκ°„μ„ μ€„μ˜€λ‹€. μ–΄μ¨Œλ“ , 이쀑포문을 μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— O(N^2)은 λ§žμ§€λ§Œ, 상황에 따라 for 루프가 λŒμ•„κ°€λŠ” 것을 쀄여쀬닀고 μƒκ°ν•˜λ©΄ λœλ‹€. 

λ¨Όμ € isprime == true 인 λΆ€λΆ„μ˜ index만 λ½‘μ•„λ‚΄λŠ” for문을 μ—†μ•΄λ‹€. λ‚˜λŠ” for 문을 λŒλ €μ„œ, 숫자λ₯Ό λΉΌκ³  λ”ν•΄μ•Όν•΄μ„œ firstIndexλ₯Ό μ‚¬μš©ν•΄μ„œ μΈλ±μŠ€κ°’μ„ λ¨Όμ € μΆ”μΆœν•΄μ€˜μ•Όν•œλ‹€κ³  μƒκ°ν–ˆλ‹€. μ“Έλ°μ—†λŠ” for문이 ν•œ 번 더 λ“€μ–΄κ°„μ…ˆμ΄λ‹€. κ·Έλƒ₯, isprimeλ§Œμ„ μ‚¬μš©ν•΄μ„œ T/F만 νŒλ³„ν•˜λŠ” 것이 μ‹œκ°„μ μœΌλ‘œλ„, μ½”λ“œμ μœΌλ‘œλ„ 훨씬 νš¨μœ¨μ μ΄λ‹€.

// ❌ λ‘λ²ˆμ§Έ μ •λ‹΅μ½”λ“œμ—μ„œλŠ” 이 뢀뢄을 μ‚­μ œν–ˆλ‹€.

for i in 1..<isprime.count {
    if isprime[i] == true {
        primeNum.append(i)
    }
}

λ‘λ²ˆμ§Έλ‘œ 바뀐 뢀뢄은 μ•„λž˜μ™€ κ°™λ‹€. 이쀑 포문이 λ˜λŠ” 뢀뢄을 보면 첫번째 ν’€μ΄λŠ” μ–΄λ–€ μˆ˜λ“€μ„ νŒλ³„ν•˜λ˜ 간에, primeNum을 μ „λΆ€ μ‚΄νŽ΄λ³΄κ²Œ λœλ‹€. λ§žμ€ λ‘λ²ˆμ§Έ ν’€μ΄λŠ”, 3λΆ€ν„° NκΉŒμ§€λ§Œ λ³΄λ©΄μ„œ μ΅œλŒ€ν•œ λ³΄λŠ” for루프 λŒμ•„κ°€λŠ” 횟수λ₯Ό 쀄여쀬닀. 그리고 if 문을 μ‚¬μš©ν•΄μ„œ isprimeμ—μ„œ true값을 κ°–λŠ”μ§€ μ‚΄νŽ΄λ§Œ 쀬닀. 

// ❌ 첫번째 풀이
for _ in 0..<100000 {
    var flag = false
    let n = Int(readLine()!)!

    if n == 0 {
        break
    } else {
        flag = true
        for num in primeNum {
            if primeNum.contains(n - num) {
                print("\(n) = \(num) + \(n-num)")
                break
            }
        }
    }
    if !flag {
        print("Goldbach's conjecture is wrong.")
    }
}

// βœ… λ‘λ²ˆμ§Έ 풀이
for _ in 0..<100000 {
    var flag = false
    let n = Int(readLine()!)!

    if n == 0 {
        break
    } else {
        for i in 3...n {
            if isprime[i] {
                let diff = n - i
                if isprime[diff] {
                    flag = true
                    print("\(n) = \(i) + \(diff)")
                    break
                }
            }
        }
    }

    if !flag {
        print("Goldbach's conjecture is wrong.")
    }
}

 

🟠 μ΅œμ’… μ •λ‹΅μ½”λ“œ

import Foundation

private func solution() {
    let isprime = primeNumArr()

    for _ in 0..<100000 {
        var flag = false
        let n = Int(readLine()!)!

        if n == 0 {
            break
        } else {
            for i in 3...n {
                if isprime[i] {
                    let diff = n - i
                    if isprime[diff] {
                        flag = true
                        print("\(n) = \(i) + \(diff)")
                        break
                    }
                }
            }
        }

        if !flag {
            print("Goldbach's conjecture is wrong.")
        }
    }
}

private func primeNumArr() -> [Bool] {
    var isprimenum = Array(repeating: true, count: 1000001)
    isprimenum[0] = false
    isprimenum[1] = false

    for i in 2..<1000001 {
        if isprimenum[i] == false { continue }

        for j in stride(from: i+i, through: 1000000, by: i) {
            isprimenum[j] = false
        }
    }
    return isprimenum
}

solution()

 

μš”μ¦˜, μ‹œκ°„λ³΅μž‘λ„μ— λŒ€ν•΄μ„œ μƒκ°ν•˜λ©΄μ„œ ν‘ΈλŠ” λΉˆλ„κ°€ λŠ˜μ–΄λ‚˜κ³  μžˆλ‹€. μž˜ν•˜κ³ μžˆλŠ”κ±°κ² μ§€!! μ•Œκ³ λ¦¬μ¦˜ κ³ μˆ˜κ°€ λ˜κ² μ–΄ 🫒 ν™”μ΄νŒ… πŸ€

https://jjalbot.com/tags/%ED%99%94%EC%9D%B4%ED%8C%85

λ°˜μ‘ν˜•