Study(진행중)/항해99

99클럽 코테 스터디 8일차 TIL + 베스트앨범(프로그래머스)

Ski_ 2024. 7. 30. 00:46

오늘의 학습 키워드

   - 알고리즘

   - 구현

   - 큐

공부한 내용 본인의 언어로 정리하기

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

큐를 사용하는 구현 문제를 풀었다.

마지막에 몇 번 까지 큐의 원소를 옮길 지 고민하는게 어려웠다.

 

풀이 과정은 다음과 같다.

0. 만약 모든 원소들의 합이 홀수라면 -1을 반환한다.

1 - 1. 2개의 큐에 각각의 원소들을 담는다

1 - 2. 2개의 큐의 원소들의 합을 각각 구한다

2. 두개의 큐 중 합이 큰 큐에서 작은 큐로 원소를 옮긴다

3. 이를 전체 원소가 n개라면 3n - 2번 반복한다.

3n - 2번 반복하는 이유는 큐에 원소를 하나만 남기고 다른 큐에 옮기는데 n - 1번의 연산이 필요하고

이후 2n - 1개의 원소가 있는 큐에 원소가 하나만 남을 때 까지 옮기는게 2n - 1번으로

총 3n - 2번 반복하면 가능한 모든 경우의 수를 알 수 있다.

 

 

풀이는 다음과 같다.

import java.util.*;

class Solution {
    
    public int solution(int[] queue1, int[] queue2) {
        
        long sum = 0, que1Sum = 0, que2Sum = 0;
        int length = queue1.length;
        
        Deque<Integer> que1 = new ArrayDeque<>();
        Deque<Integer> que2 = new ArrayDeque<>();
        
        for (int i = 0; i < length; i++) {
            sum += queue1[i];
            que1Sum += queue1[i];
            que1.addLast(queue1[i]);
            
            sum += queue2[i];
            que2Sum += queue2[i];
            que2.addLast(queue2[i]);
        }
        
        if (sum % 2 != 0) return -1;
        
        for (int i = 0; i < length * 3 - 2; i++) {
            
            if (que1Sum == que2Sum) return i;
            
            if (que1Sum > que2Sum) {
                int element = que1.pollFirst();
                // System.out.println("que1 : " + element);
                que2Sum += element;
                que1Sum -= element;
                que2.addLast(element);
            } else {
                int element = que2.pollFirst();
                // System.out.println("que2 : " + element);
                que1Sum += element;
                que2Sum -= element;
                que1.addLast(element);
            }
            
        }
        return -1;
    }
}

 내일 학습할 것은 무엇인지

내일은 운영체제에서 프로세스와 스레드 관련 단원을 공부할 예정이다.

반응형