개발/알고리즘

[프로그래머스] 쿠키 구입

환리 2020. 2. 25. 14:05

쿠키 구입

코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> cookie) {
    int answer = 0;
    int acc = 0;
    int l, m, r;
    vector<int> sum;
    int size = cookie.size();
    int lSum, rSum;

    for (int i = 0; i < size; i++) {
        acc += cookie[i];
        sum.push_back(acc);
    }

    for (m = 0; m < size - 1; m++) {
        l = 0;
        r = size - 1;
        lSum = sum[m];
        rSum = sum[size - 1] - lSum;

        while (l < r && (lSum > answer || rSum > answer)) {
            if (lSum < rSum) {
                rSum -= cookie[r];
                r--;
            } else if (lSum > rSum) {
                lSum -= cookie[l];
                l++;
            } else {
                answer = answer < lSum ? lSum : answer;
                break;
            }
        }
    }

    return answer;
}

풀이

  • cookie 배열의 크기를 size에 저장
  • i를 0 ~ (size - 1)까지 1씩 증가시키는 반복문을 수행하여 0 ~ i번째 쿠키의 합을 구하여 sum 배열에 추가
  • m을 0 ~ (size - 2)까지 1씩 증가시키는 반복문을 수행하며 0 ~ m번째 쿠키의 합을 lSum, (m + 1) ~ (size - 1) 번째 쿠키의 합을 rSum에 저장.
  • (m + 1) ~ (size - 1) 번째 쿠키의 합은 0 ~ (size - 1) 번째 쿠키의 합에서 (0 ~ m) 번째 쿠키의 합을 빼주면 O(1)로 계산 가능
  • l을 0, r을 size - 1로 설정 후 l < r이며 (lSum > answer && rSum > answer)일 동안 반복문 수행
  • 만약 lSum보다 rSum이 더 크면 rSum에 cookie[r]을 빼주고 r을 1 감소시킴
  • 만약 rSum보다 lSum이 더 크면 lSum에 cookie[l]을 빼주고 l을 1 증가시킴
  • 만약 lSum과 rSum이 같으면 answer와 lSum을 비교하여 최댓값을 answer에 저장 후 반복문 중단
  • 이로써 좌우에서 줄여나가며 l ~ m번째 바구니의 과자 수와 (m + 1) ~ r번째 바구니의 과자 수를 맞춰나감

다른 방법

  • m을 0 ~ (size - 2)까지 1씩 증가시키는 반복문을 수행
  • lo, hi에 m을 저장
  • left에 m번째 바구니의 쿠키 개수 저장, right를 0으로 초기화
  • 반복문을 수행하면서 left <= right일 경우 lo를 1 감소시키고 left에 lo번째 바구니의 쿠키 개수를 더함, left > right일 경우 hi를 1 증가시키고 right에 hi번째 바구니의 쿠키 개수를 더함
  • lo가 -1이 되거나 hi가 size가 될 경우 반복문 중단
  • left와 right가 같을 경우 answer과 left를 비교하여 최댓값을 answer에 저장

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/49995