-
[프로그래머스/Level 2] 두 큐 합 같게 만들기알고리즘 문제풀이/프로그래머스 2022. 9. 24. 23:09
https://school.programmers.co.kr/learn/courses/30/lessons/118667
카카오 기출, 그리디 유형
sum1과 sum2를 구한 후 다음과 같이 그리디를 적용한다.
- sum1 > sum2인 경우, q1 pop후 q2로 insert
- sum1 < sum2인 경우, q2 pop 후 q1으로 insert
해당 방법이 왜 유요한지 검증해보자면, sum1과 sum2의 합이 같아야하므로 합이 큰 쪽에서 원소를 pop하여 작은 쪽으로 insert를 해줘야 최소 횟수로 두 합을 같게 만들 수 있기 때문이다.
추가로 주의할 점은 두 합을 같게 만들 수 없는 경우 예외처리를 하는 것인데, 단순히 '큐의 크기 * 2'만큼 시도를 해본 후 이때도 두 합이 같지 않으면 -1를 리턴하도록 처리를 하면 오답이 발생한다. 이는 하나의 큐가 모두 비워진 후 다시 해당 큐를 채우면서 탐색하는 경우가 있기 때문이다. 이런 경우 '큐의 크기 * 2' 범위가 넘어가므로, 넉넉하게 '* 3' 처리를 해주었다.
#include <string> #include <vector> #include <queue> #include <numeric> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; ll sum1, sum2; int solution(vector<int> queue1, vector<int> queue2) { sum1 = accumulate(queue1.begin(), queue1.end(), 0); sum2 = accumulate(queue2.begin(), queue2.end(), 0); queue<int> q1, q2; for(int i = 0; i < queue1.size(); i++) { q1.push(queue1[i]); q2.push(queue2[i]); } int answer = 0; int n = 3 * queue1.size(); while(1) { if(answer == n) return -1; if(sum1 == sum2) return answer; if(sum1 > sum2) { q2.push(q1.front()); sum1 -= q1.front(); sum2 += q1.front(); q1.pop(); answer++; } else if(sum1 < sum2) { q1.push(q2.front()); sum2 -= q2.front(); sum1 += q2.front(); q2.pop(); answer++; } } }
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level 1] 신고 결과 받기 (1) 2022.10.03 [프로그래머스/Level 3] 등산코스 정하기 (0) 2022.09.29 [프로그래머스/Level 1] 성격 유형 검사하기 (0) 2022.09.24 [프로그래머스/위클리 챌린지] 9주차 (C++) (0) 2021.10.08 [프로그래머스/SQL] 헤비 유저가 소유한 장소 (MySQL) (0) 2021.10.07