본문 바로가기

프로그래머스(Java)/Level 2

[프로그래머스] 두 큐 합 같게 만들기

728x90

코드 힌트

  1. 큐의 합을 맞추기:
    • 두 큐의 합을 비교해, 두 큐의 합이 같아지도록 큐 간의 원소를 옮깁니다.
    • 각 큐의 합을 추적하면서 목표 합과 비교합니다.
  2. 목표 합 설정:
    • 두 큐의 모든 원소의 합을 계산하고, 이를 절반으로 나눈 값이 목표 합이 됩니다.
  3. 최대 반복 횟수:
    • 두 큐의 원소들을 이동하면서 큐 간의 합을 맞춥니다.
    • 두 큐의 원소 개수보다 한 번 더 이동할 수 있도록 반복 횟수를 제한합니다.
  4. 큐 간 이동:
    • 첫 번째 큐의 합이 목표보다 작으면, 두 번째 큐에서 원소를 하나 빼서 첫 번째 큐에 추가합니다.
    • 반대로 첫 번째 큐의 합이 목표보다 크면, 첫 번째 큐에서 원소를 빼서 두 번째 큐에 추가합니다.

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        Queue<Integer> q1 = new LinkedList<>(); // 첫 번째 큐
        Queue<Integer> q2 = new LinkedList<>(); // 두 번째 큐
        
        long q1Sum = 0; // 첫 번째 큐의 원소 합
        long q2Sum = 0; // 두 번째 큐의 원소 합
        int n = queue1.length + queue2.length + 1; // 최대 반복 횟수 (큐 크기보다 1회 더 반복 가능)

        // 첫 번째 큐의 원소를 큐에 추가하고 합계를 계산
        for (int i = 0; i < queue1.length; i++) {
            q1.add(queue1[i]);
            q1Sum += queue1[i];
        }

        // 두 번째 큐의 원소를 큐에 추가하고 합계를 계산
        for (int i = 0; i < queue2.length; i++) {
            q2.add(queue2[i]);
            q2Sum += queue2[i];
        }

        long target = (q1Sum + q2Sum) / 2; // 목표 합 (두 큐의 합을 반으로 나눈 값)
        
        int count = 0; // 이동 횟수 카운트
        while (q1Sum != target && count <= n) {
            count++;
            // q1의 합이 목표보다 작으면 q2에서 원소를 빼서 q1에 추가
            if (q1Sum < target) {
                int num = q2.poll();
                q1.add(num);
                q1Sum += num;
            } 
            // q1의 합이 목표보다 크면 q1에서 원소를 빼서 q2에 추가
            else {
                int num = q1.poll();
                q2.add(num);
                q1Sum -= num;
            }
        }
        
        // 두 큐의 합이 목표와 같으면 이동 횟수 반환, 그렇지 않으면 -1 반환
        if (q1Sum == target) {
            return count;
        }
        return -1;
    }
}
728x90