본문 바로가기

카테고리 없음

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

문제 Link

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

 

프로그래머스

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

programmers.co.kr

 

문제풀이 Key Point

  • 1번큐에 2번큐의 값이 모두 넘어가는 상황 1개
    2번큐에 1번큐의 값이 모두 넘어가는 상황 1개
    1번큐의 값과 2번큐의 값이 모두 교체되는 상황 1개
    👉 이렇게 총 3개가지의 경우가 있으므로 최대로 확인하는 경우는 queue의 크기 x 3이 된다.

  • 옮기는 경우의 수는 각 큐의 합이 더 큰쪽이 있다면 합계가 큰 큐의 값을 합계가 작은 큐로 옮기면 된다.
  • 오버플로우를 고려해서 type을 long으로 선언한다.

Java 문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.Queue;
import java.util.LinkedList;
 
class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int answer = 0;
        
        long queueSum1 = getQueueSum(queue1);
        long queueSum2 = getQueueSum(queue2);
        
        Queue<Long> firstQueue = changeArrayToQueue(queue1);
        Queue<Long> secondQueue = changeArrayToQueue(queue2);
        while(queueSum1 != queueSum2) {
            long number = 0;
            if (queueSum1 < queueSum2) {
                number = secondQueue.poll();
                firstQueue.add(number);
                queueSum1 += number;
                queueSum2 -= number;
                answer++;
            } else if (queueSum1 > queueSum2) {
                number = firstQueue.poll();
                secondQueue.add(number);
                queueSum2 += number;
                queueSum1 -= number;
                answer++;
            }
            
            if (answer > queue1.length * 3) {
                return -1;
            }
        }
        
        
        return answer;
    }
    
    private Queue changeArrayToQueue(int[] arrayQueue) {
        Queue<Long> queue = new LinkedList<>();
        for (int i = 0; i < arrayQueue.length; i++) {
            queue.offer((long) arrayQueue[i]);
        }
        
        return queue;
    }
    
    private int getQueueSum(int[] arrayQueue) {
        int sum = 0;
        
        for (int i = 0; i < arrayQueue.length; i++) {
            sum += arrayQueue[i];
        }
        
        return sum;
    }
}
cs