본문 바로가기
공부/2024 항해99코딩클럽

99클럽 3기 코테 스터디 8일차 TIL /[프로그래머스] 두 큐 합 같게 만들기

by 푸딩코딩 2024. 7. 29.
728x90
반응형

 

 

 

 

 

 

1. 오늘의 학습 문제 


문제


 

https://school.programmers.co.kr/learn/courses/30/lessons/118667

 

프로그래머스

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

programmers.co.kr

 

 

 

두 큐의 합을 같게 해야한다. 어떻게 최소값을 구할 수 있을까? 

큐1의 합 = 큐2의 합이 되려면, 둘 중 합이 더 큰 쪽에서 작은 쪽으로 값을 옮겨준다. 

이것을 반복해준다. 

언제까지? 

-> 두 합이 같을 때, 

그런데 이렇게 하면 정답을 구할 수 없는 경우 무한반복이 되기 때문에, 다른 조건을 추가해주어야 한다. 

만약 두 큐의 값을 서로 바꾸어주는 과정을 반복했을 때, 두 큐의 값이 원상복구된다면 한 바퀴를 돌은 와중에도 정답을 구할 수 없었다는 것이 된다. 따라서 큐들이 원상복구되는데 걸리는 최악의 시간 (q1의 길이+q2의 길이)*2로 제한을 해주었다. 


-> 두 합이 같을 때, 

-> 반복횟수가 (q1의 길이+q2의 길이)*2이하일때 

 

 

 

코드


import java.util.*;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int answer = 0;
        int limit=(queue1.length +queue2.length)*2; //두 큐의 합만큼 순회하하면 더 이상 진행불가 

        long sum1= Arrays.stream(queue1).sum();
        long sum2= Arrays.stream(queue2).sum();
        long target= (sum1+sum2)/2;

        Queue<Integer> q1= new LinkedList<Integer>();
        Queue<Integer> q2= new LinkedList<>();

        for(int i=0;i<queue1.length;i++){
            q1.add(queue1[i]);
            q2.add(queue2[i]);
        }


        while(sum1!=target && answer<=limit){
            int temp=0;
            if(sum1>sum2){
                temp = q1.poll();
                q2.add(temp);
                sum1-=temp;
                sum2+=temp;
            }
            else{
                temp = q2.poll();
                q1.add(temp);
                sum2-=temp;
                sum1+=temp;

            }
            answer++;
        }

        if(answer>limit)
            return -1;
        return answer;
    }
}

 

 

큐를 이용한 풀이! 

 

2. 오늘의 회고


 

  • 자바는 큐를 선언할 때 편의성을 위해 LinkeList를 사용한다. 

#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL

 

 

728x90
반응형