Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 두 큐 ν•© κ°™κ²Œ λ§Œλ“€κΈ°

giraffe_ 2023. 10. 19. 14:19

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

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

 

 

 

문제

  • 길이가 같은 두 개의 큐가 μ£Όμ–΄μ§„λ‹€.
  • ν•˜λ‚˜μ˜ 큐λ₯Ό 골라 μ›μ†Œλ₯Ό μΆ”μΆœ(pop)ν•˜κ³ , μΆ”μΆœλœ μ›μ†Œλ₯Ό λ‹€λ₯Έ 큐에 μ§‘μ–΄λ„£λŠ”(insert) μž‘μ—…μ„ 톡해 각 큐의 μ›μ†Œ 합이 같도둝 λ§Œλ“€λ €κ³  ν•œλ‹€.
  • μ΄λ•Œ ν•„μš”ν•œ μž‘μ—…μ˜ μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜κΈ°
    • ν•œ 번의 popκ³Ό ν•œ 번의 insertλ₯Ό ν•©μ³μ„œ μž‘μ—…μ„ 1회 μˆ˜ν–‰ν•œ κ²ƒμœΌλ‘œ κ°„μ£Ό
    • 각 큐의 μ›μ†Œ 합을 κ°™κ²Œ λ§Œλ“€ 수 μ—†λŠ” 경우, -1을 return

 

μ œν•œμ‚¬ν•­

  • 길이가 같은 두 개의 큐λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ λ°°μ—΄ queue1, queue2κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§„λ‹€.
  • 1 ≤ queue1의 길이 = queue2의 길이 ≤ 300,000
  • 1 ≤ queue1의 μ›μ†Œ, queue2의 μ›μ†Œ ≤ 10^9

 

 

 

 

 

풀이

전체 둜직

1. queue1κ³Ό queue2 각 큐의  μ›μ†Œ 합을 κ΅¬ν•œλ‹€.

2. μ›μ†Œ 합을 λΉ„κ΅ν•΄μ„œ 합이 큰 νμ—μ„œ μ›μ†Œλ₯Ό λΉΌκ³ , 합이 μž‘μ€ 큐에 λ„£λŠ”λ‹€.

3. 같을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

 

 

 

  • 자료ꡬ쑰 : Queue

 λ¬Έμ œμ—μ„œλŠ” λ§€κ°œλ³€μˆ˜λ‘œ 두 개의 큐가 μ •μˆ˜ λ°°μ—΄λ‘œ μ£Όμ–΄μ§€μ§€λ§Œ, μ›μ†Œλ₯Ό popν•˜κ³  insertν•˜λŠ” μž‘μ—…μ„ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 각 배열에 μžˆλŠ” μ›μ†Œλ“€μ„ 큐λ₯Ό 생성해 λ„£μ–΄μ€€λ‹€.

 

 

  • μ›μ†Œ ν•© κ΅¬ν•˜κΈ°, κ°±μ‹ ν•˜κΈ°

 λ§€λ²ˆ 큐 전체λ₯Ό μˆœνšŒν•˜λ©° μ›μ†Œμ˜ 총합을 κ΅¬ν•˜λŠ” 것은 λΉ„νš¨μœ¨μ μ΄λ―€λ‘œ, λ”°λ‘œ queue1κ³Ό queue2 의 μ›μ†Œ 합을 λ³€μˆ˜λ‘œ 두어 κ°±μ‹ ν•΄μ€€λ‹€. 문제의 μ œν•œ 사항을 보면 1 ≤ μ›μ†Œ ≤ 10^9 μ΄λ―€λ‘œ, 총 합이 int의 λ²”μœ„(μ•½ 21μ–΅)을 λ„˜μ„ 수 μžˆμœΌλ―€λ‘œ long으둜 μ„ μ–Έν•œλ‹€.

 

 

  • λΆˆκ°€λŠ₯ν•œ 경우 νŒλ‹¨ν•˜κΈ°

1. μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μ „λΆ€ν„° 각 큐의 μ›μ†Œ 합이 같을 수 μ—†λŠ” κ²½μš°κ°€ μžˆλ‹€. 두 큐에 μžˆλŠ” μ›μ†Œ 합이 ν™€μˆ˜μΈ κ²½μš°μ—λŠ” λ‚˜λˆ„κΈ° 2λ₯Ό ν–ˆμ„ λ•Œ μ •μˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€.

 

 

2. 일정 횟수λ₯Ό λ„˜μ–΄κ°€κ²Œ λ˜λŠ” κ²½μš°μ΄λ‹€. 횟수λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ λ¬΄ν•œλ£¨ν”„κ°€ 될 것이닀. (μ˜ˆμ‹œ 1)

 

μ²˜μŒμ— λ‚˜λ¦„ κ·œμΉ™μ„ μ°Ύμ•„ μž‘μ—… νšŸμˆ˜κ°€ queue1.length + queue2.lengthλ₯Ό λ„˜μ–΄κ°€λ©΄ -1을 리턴해 μ’…λ£Œν•˜λ„λ‘ ν–ˆλ‹€. ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 30κ°œμ€‘ 1번 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§Œ ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλ‹€.

 

문제 λ‚΄ 질문 κ²Œμ‹œνŒμ„ 보닀가 μž‘μ—… νšŸμˆ˜κ°€  queue1.length + queue2.lengthλ₯Ό λ„˜μ–΄κ°€μ„œ 두 큐의 합이 κ°™κ²Œ λ˜λŠ” κ²½μš°κ°€ μžˆλŠ” λ°˜λ‘€λ₯Ό λ°œκ²¬ν–ˆλ‹€. (μ˜ˆμ‹œ 2) κ·Έλž˜μ„œ λ„‰λ„‰ν•˜κ²Œ (queue1.length + queue2.length) * 2λ₯Ό λ„˜μ–΄κ°€λ©΄ -1을 리턴해 μ’…λ£Œν•˜λ„λ‘ ν–ˆλ‹€.

 

 

 

μ˜ˆμ‹œ1)

  • queue1 = [1, 1], queue2 = [1, 5]

→  [1, 1, 1], [5] → [1, 1, 1, 5], [ ]  [1, 1, 5], [1]  [1, 5], [1, 1]

 

=> 4λ²ˆλ§Œμ— queue1κ³Ό queue2κ°€ λ°”λ€Œμ–΄ λŒμ•„μ™€μ„œ κ²°κ΅­ λ¬΄ν•œλ£¨ν”„κ°€ 됨

 

 

μ˜ˆμ‹œ2)

  • queue1 = [1, 1, 1, 1, 1, 1] , queue2 = [ 1, 1, 1, 1, 11, 1]

 

=> 15λ²ˆλ§Œμ— 두 큐의 합이 κ°™κ²Œ λ§Œλ“€ 수 μžˆλ‹€. 

 

 

 

 

 

μ½”λ“œ

import java.util.*;

class Solution {
    public int solution(int[] queue1, int[] queue2) {
        Queue<Integer> que1 = new LinkedList<>();
        Queue<Integer> que2 = new LinkedList<>();
        
        //큐에 μ›μ†Œ λ„£κΈ°
        long sum1 = 0; //1의 총합
        for(int n : queue1) {
            que1.add(n);
            sum1 += n;
        }
        
        long sum2 = 0; //1의 총합
        for(int n : queue2) {
            que2.add(n);
            sum2 += n;
        }
        
        //합이 ν™€μˆ˜λ©΄ λΆˆκ°€λŠ₯
        if((sum1 + sum2) % 2 == 1) {
            return -1;
        }
        
        //계산
        int length = (queue1.length + queue2.length) * 2; //두 큐의 길이 ν•©
        
        int answer = 0;
        while(true) {
            //μ’…λ£Œ 쑰건
            if(answer >= length) return -1; //길이 λ„˜μ–΄κ°€λ©΄ λΆˆκ°€λŠ₯
            if(sum1 == sum2) break; //각 큐의 μ›μ†Œ ν•© κ°™μŒ
            
            //ν•© 비ꡐ ν›„, 큰 μͺ½μ—μ„œ λΉΌμ„œ μž‘μ€ μͺ½μ—μ„œ λ„£κΈ°
            if(sum1 > sum2) {
                int p = que1.poll();
                sum1 -= p;
                sum2 += p;
                que2.add(p);
            } else {
                int p = que2.poll();
                sum2 -= p;
                sum1 += p;
                que1.add(p);
            }
            
            answer++;
        }
        
        return answer;
    }
}

 

 

 

 

 

κ²°κ³Ό

 

 

 

 

 

배운점