이 영역을 누르면 첫 페이지로 이동
hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

페이지 맨 위로 올라가기

hoonDEV

BOJ 1806 - 부분합 문제풀이

  • 2020.04.19 18:44
  • 알고리즘/문제풀이

문제를 읽고 이해하기

10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.

재정의와 추상화

이 문제는 투 포인터 알고리즘(Two Pointers Algorithm)을 이용한 대표적인 문제다. 이 문제를 처음 시도할 때 아무것도 모른 채 접근했기 때문에 너무 힘들었는데, 역시 30분이 걸려도 갈피를 못 잡겠으면 구글링이 답이라는 것을 깨달았다..

투 포인터(Two Pointers Algorithm), 슬라이딩 윈도우(Sliding Window)

 

투 포인터(Two Pointers Algorithm), 슬라이딩 윈도우(Sliding Window) (수정: 2019-09-09)

조금 성향이 비슷하다고 생각하는 기법 2개를 함께 쓰려 합니다.첫 번째로 소개해드릴 기법은 투 포인터(tw...

blog.naver.com

위 문서를 읽고 나면 쉽게 풀 수 있을 것이다. 다른 점이라면, 문제에서 그 합이 S 이상이 되는 것들 중, 가장 짧은 것의 길이를 구한다는 점이다. 이걸 깨닫지 못해서 6번이나 재시도했던 경험이 있다..ㅠㅠ

코드 작성

#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;

int arr[100000];
int shortest = INT_MAX;

int main() {
    cin.sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, s;
    cin >> n >> s;
    for (int i = 0; i < n; i++) cin >> arr[i];

    int start = 0, end = 0, result = 0;
    while (true) {
        if (result >= s) { result -= arr[start++]; }
        else if (end == n) break;
        else result += arr[end++];

        if (result >= s) shortest = min(end - start, shortest);
    }
    cout << ((shortest == INT_MAX) ? 0 : shortest);
    return 0;
}

'알고리즘 > 문제풀이' 카테고리의 다른 글

BOJ 2003 - 수들의 합 2 문제풀이  (0) 2020.04.19
BOJ 10942 - 팰린드롬? 문제풀이  (0) 2020.04.19
BOJ 12015 - 가장 긴 증가하는 부분 수열 2 문제풀이  (0) 2020.04.19
BOJ 1074 - Z 문제풀이  (0) 2020.04.18
BOJ 7579 - 앱 문제풀이  (0) 2020.04.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • BOJ 2003 - 수들의 합 2 문제풀이

    BOJ 2003 - 수들의 합 2 문제풀이

    2020.04.19
  • BOJ 10942 - 팰린드롬? 문제풀이

    BOJ 10942 - 팰린드롬? 문제풀이

    2020.04.19
  • BOJ 12015 - 가장 긴 증가하는 부분 수열 2 문제풀이

    BOJ 12015 - 가장 긴 증가하는 부분 수열 2 문제풀이

    2020.04.19
  • BOJ 1074 - Z 문제풀이

    BOJ 1074 - Z 문제풀이

    2020.04.18
다른 글 더 둘러보기

정보

hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

  • hoonDEV의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그

카테고리

  • 분류 전체보기 (91)
    • 일상 (13)
      • 후기 (1)
      • 계획 (11)
    • 공지사항 (1)
    • 알고리즘 (54)
      • 문제풀이 (53)
      • 이론 (1)
    • 공부 (19)
      • React (0)
      • Angular (5)
      • Java (3)
      • C, C++ (3)
      • JavaScript (6)
      • WEB (2)
    • 디자인 (1)
      • UI, UX (1)
    • 개발 (0)
      • boom (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 이분탐색
  • 백준
  • 그리디
  • 문제풀이
  • 알고리즘
  • es6
  • javascript
  • dp

나의 외부 링크

정보

훈개발자의 hoonDEV

hoonDEV

훈개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 훈개발자. Designed by Fraccino.

티스토리툴바