알고리즘/프로그래머스

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

K.두부 2022. 8. 22. 23:54
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/118667?language=java 

 

프로그래머스

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

programmers.co.kr

풀이

문제 설명에 나와있는 내용대로 큐를 이용해서 풀면 된다. 

문제를 보자마자 높은 값에서 낮은 값으로 인자를 이동시키면 풀면 된다는 걸 알았다.

하지만 큐의 선언과 사용 방법을 알지 못해서 구글링을 했다.

 

이 문제에서 주의해야 할 건 합계(sum)가 int 형이면 오버플로우가 발생할 수 있기 때문에 long 형으로 선언해야 한다는 거다. 사실 문제를 잘 읽고 풀었다면 별 문제없을 거라고 생각한다.

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int answer = 0;
        long sum1 = 0; // queue1 을 모두 더한 값
        long sum2 = 0; // queue2 를 모두 더한 값
        
        Queue<Integer> que1 = new LinkedList<>();
        Queue<Integer> que2 = new LinkedList<>();
        
        // que1 과 sum1 에 값을 넣어줌
        for (int i=0; i<queue1.length; i++) {
            sum1 += queue1[i];
            que1.add(queue1[i]);
        }
        
        // que2 과 sum2 에 값을 넣어줌
        for (int i=0; i<queue2.length; i++) {
            sum2 += queue2[i];
            que2.add(queue2[i]);
        }
        
        int tmp = 0; // 큰 값의 큐의 첫 번째 인자를 넣기 위한 변수
        while (sum1 != sum2) {
            answer++;
            
            if (sum1 > sum2) {
                tmp = que1.poll();
                sum2 += tmp;
                sum1 -= tmp;
                que2.add(tmp);
            } else {
                tmp = que2.poll();
                sum1 += tmp;
                sum2 -= tmp;
                que1.add(tmp);
            }
            
            // 인자 값을 다 이동했음에도 sum1 과 sum2 의 값이 다를 경우
            if (answer > (queue1.length + queue2.length * 2)) return -1;
        }

        return answer;
    }
}

 

 

반응형