Programmers

[Programmers] 두 큐 합 같게 만들기

Dev_Fuji 2024. 7. 5. 22:29

문제 파악

1. 두 개의 큐 값을 같게 만들어야한다.
2. 두 개의 큐의 값이 같기 전에는 한 개의 큐는 작고 한 개의 큐는 클 것 이다.
3. 큐는 FIFO로 먼저 들어온 것이 먼저 나간다. 즉, 두 개의 큐에서 한 번의 이동에 나올 수 있는 숫자는 제일 앞에 있는 숫자이다.
4. 큰 큐의 값을 하나빼서 작은 큐에 옮기는 것을 반복하여 두 큐가 같도록 한다.
4. 단 카운트가 두 큐 사이즈의 합 *2를 넘긴 경우 두 큐가 같아 지는 경우가 없으므로 -1을 반환
5. 1 ≤ queue1의 원소, queue2의 원소 ≤ 10^9 이므로 큐의 합은 int의 최대값 넘을 수 있다. 따라서 큐의 합은 long 타입으로 선언.

접근 방법

1. 두 개의 큐를 선언 하고 int[]을 순환하며 큐에 값을 넣고 각각의 큐에 들어간 원소의 합을 구한다.
2. 두 큐의 값을 비교한다.
3-1. 만약 한 쪽 큐의 합이 크고 다른 쪽의 합이 작으면 큰 쪽 큐의 제일 앞 수를 remove해서 다른 큐에 add해준다.
3-2. 만약 두 큐의 합이 같으면 count를 반환한다.
3-3. 만약 count가 두 큐의 크기 *2 가 넘어가면 -1을 반환한다.

코드 구현

import java.util.*;
class Solution {
    public int solution(int[] queue1, int[] queue2) {
        Deque<Integer> q1 = new ArrayDeque<>();
        Deque<Integer> q2 = new ArrayDeque<>();
        long sumq1 = 0;
        long sumq2=0;
        int count=0;
        for(int i : queue1){
            sumq1+=i;
            q1.add(i);
        }
        for(int i : queue2){
            sumq2+=i;
            q2.add(i);
        }
        while (true){
            if(sumq1 ==sumq2){
                break;
            }
            else if(count>=(queue1.length+queue2.length)*2){
                count=-1;
                break;
            }
            else if(sumq1>sumq2){
                int number = q1.remove();
                sumq1 -=number;
                sumq2 += number;
                q2.add(number);
            }
            else{
                int number = q2.remove();
                sumq2 -=number;
                sumq1 += number;
                q1.add(number);
            }
            count++;
        }

        return count;
    }
}

코드 구현(오답)

💡 실패한 사례

sumq1, sumq2를 int로 선언 : 오류 발생 ⇒ queue1의 원소 값이 int 의 범위를 넘어가는 경우가 있어서 오류 발생 ⇒ sumq1, sumq2를 long 타입으로 선언
import java.util.*;
class Solution {
    public int solution(int[] queue1, int[] queue2) {
        Deque<Integer> q1 = new ArrayDeque<>();
        Deque<Integer> q2 = new ArrayDeque<>();
        int sumq1 = 0; //오답의 원인
        int sumq2=0; //오답의 원인
        int count=0;
        for(int i : queue1){
            sumq1+=i;
            q1.add(i);
        }
        for(int i : queue2){
            sumq2+=i;
            q2.add(i);
        }
        while (true){
            if(sumq1 ==sumq2){
                break;
            }
            else if(count>=(queue1.length+queue2.length)*2){
                count=-1;
                break;
            }
            else if(sumq1>sumq2){
                int number = q1.remove();
                sumq1 -=number;
                sumq2 += number;
                q2.add(number);
            }
            else{
                int number = q2.remove();
                sumq2 -=number;
                sumq1 += number;
                q1.add(number);
            }
            count++;
        }

        return count;
    }
}

배우게 된 점

💡 두 큐의 합을 구할 때 막연히 더하고 빼는 것이 아니라 최적의 경우를 생각해보고 푸는 것이 좋을 것 같다.
    또한, 문제에서 값의 범위를 확인하여 변수의 타입을 설정하는 습관을 길러야할 것 같다.