프로그래머스|두 큐 합 같게 만들기

README·2022년 12월 19일
0

파이썬 PS풀이

목록 보기
102/136

문제 설명

두 큐를 입력받고 큐에서 숫자들을 옮겨가며 두 큐에 들어있는 숫자가 같게 만드는데 최소 몇 번의 연산이 필요한지 구하는 문제입니다. 연산의 횟수를 구할 때 숫자를 옮기는 과정(한쪽 큐에서 pop하는 단계+pop한 숫자를 다른 쪽 큐에 append하는 단계)를 합쳐 한 번으로 계산합니다. 만약 두 큐의 값이 같아질 수 없으면 -1을 출력합니다.

작동 순서

  1. 두 큐를 입력받습니다.
  2. 각 큐의 합을 구합니다.
  3. 두 큐의 합이 홀수인 경우 두 큐의 값이 같아지는 것이 불가능하므로 -1을 출력합니다.
  4. 반복문을 통해서 양쪽 큐의 값을 같게 만들어주는 연산을 수행합니다.
  5. 만약 양쪽 큐의 합이 같아진 경우 연산횟수를 출력합니다.
  6. 만약 한쪽 큐의 합이 더 큰 경우 그 큐에서 다른 큐로 숫자를 옮기는 연산을 수행합니다.
  7. 만약 어느 한 쪽 큐의 연산횟수가 전체 숫자의 개수보다 커진 경우 두 큐의 값을 같게 만들수 없는 경우이므로 -1을 출력합니다.(큐에 있는 모든 숫자들을 옮겨봤는데도 같게 만들 수 없으면 똑같은 연산을 다시 수행해도 양쪽 큐를 같게 만들 수 없습니다.)

소스코드

from collections import deque 
def solution(queue1, queue2):
    answer = 0
    q1=deque()
    q2=deque()
    
    for i in queue1:
        q1.append(i)
    for i in queue2:
        q2.append(i)
    
    lenQueue = len(queue1)*2
    
    sum1 = sum(queue1)
    sum2 = sum(queue2)
    
    calc1 = 0
    calc2 = 0
    
    if (sum1+sum2)%2 == 1:
        return -1
    
    while True:
        if sum1==sum2:
            return answer
        answer += 1
        if sum1>sum2:
            calc1 += 1
            num = q1.popleft()
            sum1 -= num
            sum2 += num
            q2.append(num)
        else:
            calc2 += 1
            num = q2.popleft()
            sum1 += num
            sum2 -= num
            q1.append(num)
        if calc1 > lenQueue or calc2 > lenQueue:
            return -1
profile
INTP 개발자 지망생

0개의 댓글