ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 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()

     

    배운점

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

     

    댓글

Designed by Tistory.