카테고리 없음

백준 2003 수들의 합2

삼쓰 웅쓰 2021. 1. 22. 10:53
728x90

출처: https://www.acmicpc.net/problem/2003

분류: 두 포인터


접근방식

수열의 특정 구간의 합이 특정한 수가 되는 경우의 수를 구하는, 대표적인 투 포인터 문제입니다. 

2개의 포인터를 둬서 하나는 합이 원하는 수보다 크거나 같으면, 다른 하나는 합이 원하는 수보다 작으면 움직여주면서 합을 계산해주면 됩니다:)

 

해결방법

protocol Readable {
    func readSingleValue() -> String
    func readArray(with separator: Character) -> [String]
}

extension Readable {
    func readSingleValue() -> String {
        return readLine()!
    }
    
    func readSingleValue() -> Int {
        return Int(readLine()!)!
    }
    
    func readArray(with separator: Character) -> [String] {
        return readLine()!.split(separator: " ").map { String($0) }
    }
    
    func readArray(with separator: Character) -> [Int] {
        return readLine()!.split(separator: " ").map { Int(String($0))! }
    }
}

class BOJ2003: Readable {
    
    func input() {
        let data: [Int] = readArray(with: " ")
        target = data[1]
        array = readArray(with: " ")
    }
    
    // MARK: Properties
    
    var array: [Int]!
    var target: Int!
    
    // MARK: Solution
    
    func solution() {
        input()
        
        var result = 0
        var first = 0
        var second = 0
        var sum = array[0]
        while first < array.count, second < array.count {
            if sum == target {
                result += 1
                first += 1
                if first < array.count {
                    sum += array[first]
                }
            } else if sum > target {
                sum -= array[second]
                second += 1
            } else {
                first += 1
                if first < array.count {
                    sum += array[first]
                }
            }
        }
        print(result)
    }
}

BOJ2003().solution()

 

배운점

어려운 문제는 아니었지만 이런식의 접근 방법, 풀이 등은 많이 활용되니 잘 알아두어야 할 것 같습니다 :)