Algorithm/Programmers

[Programmers] 두 큐 합 같게 만들기 / ⭕

cks._.hong 2024. 10. 7. 10:19
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 제출 코드 (40분 49초 / 큐)

import java.util.*;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int answer = 0;
        ArrayDeque<Integer> q1 = new ArrayDeque<>();
        ArrayDeque<Integer> q2 = new ArrayDeque<>();
        long tq1 = 0;
        long tq2 = 0;
        boolean isValid = false;
        
        for(int i = 0; i < queue1.length; i++) {
            q1.add(queue1[i]);
            q2.add(queue2[i]);
            tq1 += queue1[i];
            tq2 += queue2[i];
        }
        
        while(tq1 != tq2) {
            if(answer == queue1.length * 3) {
                answer = -1;
                break;
            }
            if(tq1 > tq2) {
                int t = q1.pop();
                q2.add(t);
                tq1 -= t;
                tq2 += t;
            } else if(tq1 < tq2) {
                int t = q2.pop();
                q1.add(t);
                tq2 -= t;
                tq1 += t;
            }
            answer++;
        }
        return answer;
    }
}

 

 

2. 구현 로직

  1. 각 배열의 값을 큐에 넣어주고 큐의 합을 각각 저장한다.
  2. 각 큐의 합이 같아질 때까지 반복한다.
    1. tq1이 크다면 q1.pop()하고 해당 값만큼 tq1의 값을 빼준다. 그리고 tq2의 값을 해당 값만큼 더한다.
    2. tq2이 크다면 q2.pop()하고 해당 값만큼 tq2의 값을 빼준다. 그리고 tq1의 값을 해당 값만큼 더한다.
    3. 만약, answer가 queue1.lenght*3과 같다면 같은 값을 만들 수 없으므로 answer = -1

 

3. 유의할 점

  • 큐의 원소 합을 같게 만들 수 없는 경우의 조건을 고려해야될 거 같다.