-
백준 2003 수들의 합2카테고리 없음 2021. 1. 22. 10:53728x90
출처: 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()
배운점
어려운 문제는 아니었지만 이런식의 접근 방법, 풀이 등은 많이 활용되니 잘 알아두어야 할 것 같습니다 :)