해당 문제는 프로그래머스에서 푸실 수 있습니다.
programmers.co.kr/learn/courses/30/lessons/49995
1. 문제
과자를 바구니 단위로 파는 가게가 있습니다.
이 가게는 1번부터 N번까지 차례로 번호가 붙은 바구니 N개가 일렬로 나열해 놨습니다.
철수는 두 아들에게 줄 과자를 사려합니다.
첫째 아들에게는 l번 바구니부터 m번 바구니까지,
둘째 아들에게는 m+1번 바구니부터 r번 바구니까지를 주려합니다.
단, 두 아들이 받을 과자 수는 같아야 합니다(1 <= l <= m, m+1 <= r <= N).
즉, A[i] 를 i번 바구니에 들어있는 과자 수라고 했을 때, A[l]+..+A[m] = A[m+1]+..+A[r] 를 만족해야 합니다.
각 바구니 안에 들은 과자 수가 차례로 들은 배열 cookie가 주어질 때,
조건에 맞게 과자를 살 경우 한 명의 아들에게 줄 수 있는 가장 많은 과자 수를
return 하는 solution 함수를 완성해주세요. (단, 조건에 맞게 과자를 구매할 수 없다면 0을 return 합니다)
제한사항
- cookie의 길이는 1 이상 2,000 이하입니다.
- cookie의 각각의 원소는 1 이상 500 이하인 자연수입니다.
입출력 예
cookie | result |
[1,1,2,3] | 3 |
[1,2,4,5] | 0 |
입출력 예 설명
입출력 예 #1
첫째 아들에게 2, 3번 바구니를, 둘째 아들에게 4번 바구니를 사주면 두 아들은 각각 과자 3개를 받습니다.
입출력 예 #2
주어진 조건에 맞게 과자를 살 방법이 없습니다.
2. 풀이
해당문제는 프로그래머스의 가장 긴 팰린드롬 문제와 비슷합니다.
programmers.co.kr/learn/courses/30/lessons/12904
다른점은 왼쪽의 합들과 오른쪽의 합들 값이 같을 때, 최대 합을 구하는 점이 다릅니다.
그리고 문제대로 연속된 수의 합이기 때문에 생각해야할 조건이 많아짐니다.
이를 한방에 해결할 방법이 있으니 바로 i 값을 기준으로 범위를 양 옆으로 넓혀가는 방법입니다.
이렇게 구해주면 왼쪽과 오른쪽 값이 같을 때, 최대 합을 구할 수 있습니다.
왜냐하면, 문제는 같은 쿠키를 나눠줄 수 있는 최대 개수를 구하는 문제이기 때문입니다.
때문에 저희는 i 값을 기준으로 왼쪽과 오른쪽이 경계를 벗어나지 않도록 예외처리만 해주면 문제는 쉽게 풀립니다.
3. 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<int> cookie) {
int answer = 0;
for(int i = 0; i < cookie.size() - 1; i++){
int left_sum = cookie[i];
int right_sum = cookie[i + 1];
int l_idx = i;
int r_idx = i + 1;
while(true){
if(left_sum == right_sum)
answer = max(answer, left_sum);
if(left_sum > right_sum){
if(r_idx + 1 == cookie.size()) break;
right_sum += cookie[++r_idx];
}
else{
if(l_idx - 1 < 0) break;
left_sum += cookie[--l_idx];
}
}
}
return answer;
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스] C++ 2021 카카오 인턴십 - 거리두기 확인(Level 2) (0) | 2021.07.11 |
---|---|
프로그래머스] C++ 풍선 터트리기(Level 3) (0) | 2021.03.31 |
프로그래머스] C++ 숫자 블록(Level 4) (0) | 2020.11.30 |
프로그래머스] C++ 2020 KAKAO BLIND RECRUITMENT - 외벽 점검(Level 3) (0) | 2020.11.01 |
프로그래머스] C++ 2020 카카오 인턴십 - 경주로 건설(Level 3) (0) | 2020.10.20 |
댓글