코딩 테스트/프로그래머스

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

sangjin98 2024. 3. 7. 22:14
반응형

문제

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

 

프로그래머스

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

programmers.co.kr

 

문제 분석

큐 2개가 주어지고 두 큐의 원소의 합이 같도록 하기 위해서 몇번의 연산이 필요한 지 묻는 문제이다.

큐에서 원소 하나를 빼고 넣는 과정을 연산 1번 일어난 것으로 계산한다.

 

원소 하나의 크기가 최대 10^9 이기 때문에 원소의 합을 구하는 과정에서 int 의 크기를 초과한다. 

 

문제 접근

원소의 합이 큰 큐에서 빼서 합이 작은 큐에 넣는 과정을 반복하면 제일 빠르게 두 큐의 원소의 합이 같아진다.

문제는 두 큐의 합이 같아질 수 없는 경우가 있는데 이때는 얼마나 반복해야 두 큐의 합이 같지 않다는 것을 증명할 수 있는가이다.

 

한쪽 큐에서 다른쪽 큐로 전부 넘어 왔다가 다시 돌아오고 다른 쪽 큐도 마찬가지로 생각해 본다면 큐의 길이 4배 정도 계산했을 경우에도 같아지지 않는다면 같을 수 없다고 판단할 수 있다.

 

코드

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int result = 0;
        Queue<Integer> queueOne = Arrays.stream(queue1)
                .boxed()
                .collect(Collectors.toCollection(LinkedList::new));

        Queue<Integer> queueTwo = Arrays.stream(queue2)
                .boxed()
                .collect(Collectors.toCollection(LinkedList::new));

        long sumOne = queueOne.stream().mapToLong(Integer::longValue).sum();
        long sumTwo = queueTwo.stream().mapToLong(Integer::longValue).sum();

        int size = queue1.length * 4;
        for (int i = 0; i < size; i++) {
            if (sumOne == sumTwo) {
                return result;
            }

            if (sumOne < sumTwo) {
                int num = queueTwo.poll();
                queueOne.offer(num);
                sumTwo -= num;
                sumOne += num;
                result++;
            }else{
                int num = queueOne.poll();
                queueTwo.offer(num);
                sumOne -= num;
                sumTwo += num;
                result++;
            }
        }

        return -1;
    }
}
반응형