BOJ 1806 부분합

LONGNEW·2021년 1월 28일
0

BOJ

목록 보기
116/333

https://www.acmicpc.net/problem/1806
시간 0.5초, 메모리 128MB
input :

  • N S(10 ≤ N < 100,000)(0 < S ≤ 100,000,000)
  • 수열(1 <= 수 <= 10000)

output :

  • 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력

아이템이 1개일 때도 생각해 줘야 하지 않나 생각하다가, 합을 만드는 게 불가능한 경우를 예외처리 안 해줬다 ㅋㅋㅋㅋㅋㅋㅋㅋ

아이템 1개일 때도 해주려면, 그냥 back_idx를 0 부터 시작하면 되겠다.
근데 진짜 왜 되지?




2022.02.02 재채점

과거에 왜 저렇게 적었는지도 모르겠다.
추가된 데이터는 딱 내가 제출한 코드를 저격한 케이스였다.

10 10
10 1 1 1 1 1 1 1 1 1
ans : 1

시작할 떄 부터 backidx를 1로 지정했으니 걸릴 수 밖에 없다.

다음 풀이

  1. 부분합이 S 이상이어야 한다.
  2. 가장 짧은 것의 길이를 구하라.

모든 합을 구한다면 시간이 터질거다. 투포인터를 사용하자.
투포인터가 끝나려면 꼭 start가 end보다 커져야 하나? 근데 그게 끝까지 안 가고 발생하면?
이라는 문제가 존재한다.
end가 배열의 밖으로 나간다는 의미는 해당 부분합이 S보다 작은데 더 이상 원소도 없다는 의미이다. 결국 끝까지 다 돌면 되는 것이다.

구현이 좀 귀찮았다.




import sys

n, s = map(int, sys.stdin.readline().split())
data = list(map(int, sys.stdin.readline().split()))
ans = float("inf")

start, end = 0, 0
temp = data[0]

while True:
    if start > end:
        end = start + 1

        if end < n:
            temp += data[end]
        continue

    if temp >= s:
        ans = min(ans, end - start + 1)
        temp -= data[start]
        start += 1
        continue

    end += 1
    if end >= n:
        break
    temp += data[end]


print(0 if ans == float("inf") else ans)
#include <iostream>
#include <vector>

using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::min;

int n, s;
vector<int> data;

int main() {
    int start = 0;
    int end = 0;

    cin >> n >> s;
    for (int i = 0; i < n; ++i) {
        int temp;
        cin >> temp;
        data.push_back(temp);
    }

    int temp = data[0];
    int ans = 1000000000;

    while (end < n){
        if (start > end){
            end = start + 1;
            if (end < n)
                temp += data[end];
            continue;
        }

        if (temp >= s){
            ans = min(ans, end - start + 1);
            temp -= data[start];
            start += 1;
            continue;
        }

        end += 1;
        if (end >= n)
            break;
        temp += data[end];
    }

    if (ans == 1000000000)
        cout << 0;
    else
        cout << ans;

    return 0;
}


0개의 댓글