자바/코딩테스트

[프로그래머스] 두 큐 합 같게 만들기 - Java(자바)

대전집주인 2024. 5. 22. 16:56
728x90
SMALL

 

문제 이해

  • 길이가 같은 큐 두개가 주어진다.
  • 큐에 들어간 원소의 합이 같아지게 pop,insert의 작업을 한다.
  • 작업의 횟수가 최소값인 경우를 구해야 한다.
  • 원소의 값은 10^9 까지이고 원소의 개수는 30만개로 sum을 구하기에는 스택오버 플로우가 일어나기
    때문에 sum 타입을 long으로 해준다.
  • 최소횟수를 구하기 위해서 주어진 두 큐의 합을 비교한다.                                                                                            큰합계(큐) -> 작은합계(큐) 원소를 큰합 큐에서 poll 작은합 큐로 원소를 insert
  • 위 처럼 큐를 pop, insert 하면서 두큐의 합계가 같아 질때까지 반복한다.
  • 예#3 번처럼 원소의 합이 안나올 경우를 생각해야 한다.
  • 안나오는 경우 len(que) * 3 < answer 일 경우 루프에서 탈출시킨다.
import java.util.*;
class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int answer = 0;
        long que1Sum = 0;
        long que2Sum = 0;
        int size = queue1.length * 3;
        
        Queue<Integer> que1 = new LinkedList<>();
        Queue<Integer> que2 = new LinkedList<>();
        
        for(int i = 0; i<queue1.length; i++){
            que1.add(queue1[i]);
            que2.add(queue2[i]);
            
            que1Sum += queue1[i];
            que2Sum += queue2[i];
        }
        
        while(que1Sum != que2Sum){
            if(size < answer){
                answer = -1;
                break;   
            }
            
            if(que1Sum > que2Sum){
                que2Sum += que1.peek();
                que1Sum -= que1.peek();
                que2.add(que1.poll());
            }else{
                que1Sum += que2.peek();
                que2Sum -= que2.peek();
                que1.add(que2.poll());
            }
            
            answer++;
        }
        
        
        return answer;
    }
}
728x90
LIST