λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🐍 Algorithm/μ•Œκ³ λ¦¬μ¦˜-Swift

[μ•Œκ³ λ¦¬μ¦˜/Swift] BOJ 1644 μ†Œμˆ˜μ˜ 연속합 - 투 포인터 & μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

by Danna 2021. 6. 1.
728x90
728x90

이미지λ₯Ό λˆ„λ₯΄λ©΄ 문제둜 μ—°κ²°λ©λ‹ˆλ‹€.

πŸ‘€ ν•„μš”ν•œ 곡뢀

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

  • μ†Œμˆ˜λ₯Ό νŒλ³„ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜. 

 

투 포인터

  • 일차원 λ°°μ—΄μ—μ„œ 두 개의 포인터λ₯Ό 지정해 κ³„μ‚°ν•˜λŠ” 방법

 

πŸ’‘ 풀이 방법

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 두 κ°œλ…μ„ μ „λΆ€ μ μš©ν•΄μ„œ 문제λ₯Ό ν’€λ©΄ λ©λ‹ˆλ‹€. λ¨Όμ €, μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ μ†Œμˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. 찾은 μ†Œμˆ˜ 배열을 톡해 투 ν¬μΈν„°λ‘œ μ ‘κ·Όν•΄μ„œ μ—°μ†λœ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ N 이 λ§Œλ“œλŠ” 경우의 수λ₯Ό μ²΄ν¬ν•˜λ©΄ λ©λ‹ˆλ‹€!

 

  • checkPrimes ν•¨μˆ˜ :: μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ μ†Œμˆ˜λ₯Ό νŒλ³„ν•˜λŠ” ν•¨μˆ˜
  • findSeries ν•¨μˆ˜ :: 투 포인터λ₯Ό μ΄μš©ν•΄ μ—°μ†λœ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ μžμ—°μˆ˜λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 경우의 수λ₯Ό μ„ΈλŠ” ν•¨μˆ˜ 

 

πŸ₯ Swift 풀이

// μ†Œμˆ˜μ˜ 연속합
func checkPrimes(n: Int, isPrimes: inout [Bool]) {
    // 2 λΆ€ν„° n κΉŒμ§€ μ†Œμˆ˜μΈμ§€ ν™•μΈν•œλ‹€.
    for i in 2...n {
        if isPrimes[i] == false { continue }
        var j = i * 2 // i 의 배수λ₯Ό μ†Œμˆ˜λͺ©λ‘μ—μ„œ μ œμ™Έν•œλ‹€.
        while j <= n {
            isPrimes[j] = false
            j += i // i 의 배수만 ν™•μΈν•œλ‹€
        }
    }
}

func findSeries(n: Int, primes: [Int]) -> Int {
    // ν•˜λ‚˜ 이상 μ—°μ†λœ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ μžμ—°μˆ˜λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 경우의 수 μ„ΈκΈ°
    // 투 포인트 :: 일차원 λ°°μ—΄μ—μ„œ 두 개의 포인트λ₯Ό 움직이며 μ²΄ν¬ν•˜λŠ” 것
    var start = 0, end = 0
    var sum = 0
    var count = 0
    
    while end <= primes.count {
        if sum >= n {
            // sum 이 λͺ©ν‘œκ°’보닀 크면 start 값을 μ œμ™Έν•˜κ³ , 였λ₯Έμͺ½μœΌλ‘œ ν•œμΉΈ 이동
            sum -= primes[start]
            start += 1
        } else {
            // sum 이 λͺ©ν‘œκ°’보닀 μž‘μœΌλ©΄ end 값을 μΆ”κ°€ν•˜κ³ , 였λ₯Έμͺ½μœΌλ‘œ ν•œμΉΈ 이동
            if end < primes.count { sum += primes[end] }
            end += 1
        }
        if sum == n {
            // μƒˆλ‘œ κ³„μ‚°ν•œ sum 값이 λͺ©ν‘œμ™€ κ°™μœΌλ©΄ 경우의 수 카운트
            count += 1
        }
    }
    return count
}

func BOJ_1644() {
    let N = Int(readLine()!)!
    guard N > 1 else {
        print(0)
        return
    }
    
    var isPrimes = Array(repeating: true, count: N+1)//1000001)
    checkPrimes(n: N, isPrimes: &isPrimes)
    var primes: [Int] = []
    
    for i in 2 ... N {
        if isPrimes[i] == true {
            //print(i)
            primes.append(i)
        }
    }
    print(findSeries(n: N, primes: primes))
}

μ°Έκ³  λΈ”λ‘œκ·Έ

투 포인터

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 

728x90
728x90