[2022 KAKAO TECH INTERNSHIP] 두 큐 합 같게 만들기

최민길(Gale)·2023년 3월 5일
1

알고리즘

목록 보기
49/172

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/118667

[이 문제는 프로그래머스에서 푼 문제입니다.]
이 문제는 큐를 이용하여 문제 조건을 하나하나 구현하면 풀 수 있습니다. 전체적인 로직은 다음과 같습니다.

  1. 각 큐의 합을 계산한다.
  2. 이 때 최댓값이 나머지의 합보다 크다면 -1을 리턴한다.
  3. 각 큐의 합이 같을때까지 반복문을 돌린다.
  4. 합이 큰 쪽에서 pop하고 작은 쪽에 해당 값을 insert한다 (그리디)
  5. 큐에 담긴 모든 원소들을 다른 큐로 옮기고 다시 원래대로 돌아오는데 걸리는 횟수는 초기 큐의 4배이기 때문에 해당값보다 크다면 한 바퀴 돈 것이므로 -1 리턴

다음은 코드입니다.

import java.util.*;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        // 각 큐의 합 계산
        int max = 0;
        
        Queue<Integer> q1 = new LinkedList<>();
        Queue<Integer> q2 = new LinkedList<>();
        
        long sum1 = 0;
        long sum2 = 0;
        
        for(int i=0;i<queue1.length;i++){
            q1.add(queue1[i]);
            sum1 += queue1[i];
            if(max < queue1[i]) max = queue1[i];
        }
        
        for(int i=0;i<queue2.length;i++){
            q2.add(queue2[i]);
            sum2 += queue2[i];
            if(max < queue2[i]) max = queue2[i];
        }
        
        // 이 때 최댓값이 나머지의 합보다 크다면 -1 리턴
        if((sum1+sum2-max) < max) return -1;
        
        // 값이 같을때까지 실행
        int answer = 0;
        while(true){
            // 큐에 담긴 모든 원소들을 다른 큐로 옮기고 다시 원래대로 돌아오는 횟수 = 초기 큐의 4배
            // 따라서 초기 큐의 길이의 4배보다 크다면 한 바퀴 돈 것이므로 -1 리턴
            if(answer > queue1.length * 4) return -1;
            
            // 만약 sum1 < sum2라면 q2를 pop하고 q1에 해당값을 insert
            if(sum1 < sum2){
                int val = q2.poll();
                q1.add(val);
                sum1 += val;
                sum2 -= val;
            }
            // 만약 sum2 < sum1라면 q1를 pop하고 q2에 해당값을 insert
            else if(sum1 > sum2){
                int val = q1.poll();
                q2.add(val);
                sum1 -= val;
                sum2 += val;
            }
            // 두 값이 같다면 break
            else break;
            
            answer++;
        }
        
        return answer;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글