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