알고리즘

프로그래머스 두 큐 합 같게 만들기(JAVA)

박카스마시며코딩 2023. 7. 19. 20:45

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

 

프로그래머스

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

programmers.co.kr

 

저는 투 포인트를 통해 문제를 해결하였습니다.

먼저 두 큐의 총 합을 구하고 이 값이 짝수인지 판단하였습니다. 짝수가 되지 않는다면, 합을 같게 나눌 수 없기에 바로 -1을 리턴하였습니다.

그 다음은 두 큐를 하나로 합치면서 첫 큐의 합을 구하였습니다.

이제 투 포인트를 0, 한 큐의 사이즈로 잡았습니다. (첫 큐의 합을 구하였기에 이렇게 하였습니다.)

여기서 합이 두 큐의 총합/2보다 작다면 끝포인트를 늘리면서 합을 늘리고 작다면 시작포인트를 늘리면서 합을 줄이면서 두 큐의 총합/2과 같아지는 지점이 있는지 파악하여 문제를 해결하였습니다.

 

class Solution {
    private static final int NOT_FOUND = -1;
    public int solution(int[] queue1, int[] queue2) {
        
        long sum = 0;
        int size = queue1.length;
        for(int i = 0 ; i < size ; i++){
            sum += queue1[i] + queue2[i];
        }
        if(sum % 2 != 0){
            return NOT_FOUND;
        }
        long halfSum = sum / 2;
        int totalSize = 2*size;
        int[] totalQueue = new int[totalSize];
        sum = 0;
        for(int i = 0 ; i < size ; i++){
            totalQueue[i] = queue1[i];
            sum += queue1[i];
            totalQueue[size + i] = queue2[i];
        }
        int startIndex = 0;
        int endIndex = size;
        int answer = 0;
        while(true){
            if(sum == halfSum){
                break;
            }
            if(sum < halfSum){
                if(endIndex >= totalSize){
                    return NOT_FOUND;
                }
                sum += totalQueue[endIndex++];
                answer++;
                continue;
            }
            if(sum > halfSum){
                sum -= totalQueue[startIndex++];
                answer++;
                continue;
            }
            answer++;
        }
        return answer;
    }
}