본문 바로가기
Algorithm🐰/백준

[백준] Swift 1806 부분합 투포인터

by Jouureee 2022. 3. 29.

문제 :

https://www.acmicpc.net/problem/1806

 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net

 

풀이 :

연속된 배열의 부분 배열 중 그 합이 M 이상이 되는 부분 배열 중에서 길이가 짧은 배열의 길이를 출력하는 문제다.

startIndex와 endIndex를 첫 인덱스에 위치하도록 두었고, sum 값은 원소 초기값으로 설정했다.

그리고 while문을 돌때마다 endIndex값은 하나씩 증가시킨다. 그리고 sum 값이 M보다 큰 경우가 발생한다면 길이를 줄일 수 있을만큼 줄이는 것이 목적이므로 startIndex값으로 tempIndex를 초기화 시켜 준 뒤 다음번에 endIndex를 늘려 검사 할경우 전 startIndex부터 검사할 필요가 없으므로 tempIndex값을 가지게 한다.

 

반례 참고하면 좋을 거 같다 !

https://bingorithm.tistory.com/13

 

"백준 1806번-부분합" 반례 모음

www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000..

bingorithm.tistory.com

 

swift 코드 :

//
//  main.swift
//  SOMA👩🏻‍💻
//
//  Created by JoSoJeong on 2022/03/29.
//

import Foundation

var line = readLine()!.split(separator: " ").map { Int($0)! }
var n = line[0]
var m = line[1]

var arr = readLine()!.split(separator: " ").map { Int($0)! }

var startIndex = 0
var endIndex = 0
var sum = arr[startIndex]
var length = 1000000

func findMinLength() -> Int {
    if(arr.reduce(0, +) < m){
        return 0;
    }
    while endIndex < n {
        if(sum >= m){
            var tempIndex = startIndex
            while(tempIndex <= endIndex) {
                if(sum - arr[tempIndex] >= m){
                    sum -= arr[tempIndex]
                    tempIndex += 1
                }else {
                    break;
                }
            }
            length = min(length, endIndex - tempIndex + 1)
            startIndex = tempIndex
        }
        if(endIndex + 1 < n){
            sum += arr[endIndex+1]
        }
        endIndex += 1

    }
    return length
}

print(findMinLength())

댓글