문제풀이/프로그래머스

두 큐 합 같게 만들기(카카오) 문제풀이

soo-dal 2024. 3. 7. 17:00

문제 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

문제 접근 방식

두 큐가 주어지며, 서로의 원소를 다른원소에 넣어가면서 두 큐의 합이 같도록 하는 최소 시행 횟수를 구하는 문제이다. 문제를 풀 때 고려해야할 사항은 크게 2가지이며, 이중 마지막 항목에 대해 어떻게 처리할지 몰라서 넘어갔다.

1. 어떤 큐에서 요소를 pop할 것인가?
>> 두 큐의 합이 다르다고 가정했을 때, 합이 같도록 하기 위해서는 합이 큰 큐에서 작은 큐로 요소를 옮겨줘야한다

2. 만약 합이 같도록 하는 방법이 없을 때 언제 끊어줄 것인가?
>> 이 부분을 어떻게 할지 몰라서 삽질하다가 넘겼다

>> (두 큐 길이의 합) *2 만큼 시행하면 모든 경우를 파악할 수 있다

 

 

시간 복잡도

(최대 두 큐 길이의 합) x 2 만큼을 선형 탐색하기 때문에 O(2N) 이 걸리며 N의 값이 최대 3e5 이기 때문에 시간 내에 동작한다.

 

 

코드

from collections import deque
def solution(queue1, queue2):
    s1,s2=sum(queue1),sum(queue2)
    q1=deque(queue1)
    q2=deque(queue2)
    count=0
    if s1==s2:
        return 0
    if (s1+s2)%2!=0:
        return -1
    
    size=(len(q1)+len(q2))*2
    for i in range(size):
        if s1==s2:
            return i
        elif s1>s2:
            v=q1.popleft()
            s1-=v
            q2.append(v)
            s2+=v
        else:
            v=q2.popleft()
            s2-=v
            q1.append(v)
            s1+=v
        
    return -1

 

 

회고

1. 언제까지 반복문을 돌릴지 모를 때, 상한선을 구하는 것도 방법이다
2. 파이썬의 경우 큐를 사용할 때, 일반 리스트보다는 deque를 사용하는 것이 효율적이다