Algorithm

[코딩테스트/Python] 프로그래머스 두 큐 합 같게 만들기

재온 2023. 5. 1. 21:55

문제 

  • que 관련 문제: 하나의 큐에서 원소 추출해서 다른 큐에 집어넣기 (큐는 선입 선출)
  • 결과적으로 두 큐의 원소 합이 같도록 만들기(전체 합을 파악한 후, 나눠서 담는다고 생각하자)


풀이 

첫 시도 

from collections import deque
def solution(queue1, queue2):
    answer = 0
    queue1=deque(queue1) ; queue2=deque(queue2) #큐로 변환해주기(popleft 함수 사용위해)
    que_sum = sum(queue1)+sum(queue2)
    q_s = que_sum //2
    if que_sum % 2 != 0: #반반 나눌 수 없으면(2로 나누어 떨어지지 않으면 -1 return)
        return -1
    if que_sum % 2 == 0:
        while True:
            v=queue1.popleft() 
            queue2.append(v)
            answer +=1
    return answer

그냥 쭉쭉 다 옮겨버려서 empty deque가 만들어짐

-> Sum을 각각 변수로 저장한 후에 조건을 맞춰 break해줄 필요가 있다 

 

두번째 시도 

#que 관련 문제: 하나의 큐에서 원소 추출해서 다른 큐에 집어넣기 (큐는 선입 선출)
#-> 결과적으로 두 큐의 원소 합이 같도록 만들기(전체 합을 파악한 후, 나눠서 담는다고 생각)
from collections import deque
def solution(queue1, queue2):
    answer = 0
    queue1=deque(queue1) ; queue2=deque(queue2) #큐로 변환해주기(popleft 함수 사용위해)
    q1= sum(queue1) ; q2= sum(queue2)
    que_sum = q1+q2

    if que_sum % 2 != 0: #반반 나눌 수 없으면(2로 나누어 떨어지지 않으면 -1 return)
        return -1

    while True:
        if q1>q2:
            v=queue1.popleft() 
            queue2.append(v)
            q1 -= v ; q2+=v #처리 해준 만큼 sum에서 빼주기 
            answer+=1
        elif q1< q2:
            v=queue2.popleft() 
            queue1.append(v)
            q2 -= v ; q1+=v #처리 해준 만큼 sum에서 빼주기 
            answer+=1
        else:
            break
    return answer

흠냐 .. 아 ! 

  • 주의: 언어에 따라 합 계산 과정 중 산술 오버플로우 발생 가능성이 있으므로 long type 고려가 필요합니다.

limit를 만들어서 예외 처리 추가 

 

최종 코드 

#que 관련 문제: 하나의 큐에서 원소 추출해서 다른 큐에 집어넣기 (큐는 선입 선출)
#-> 결과적으로 두 큐의 원소 합이 같도록 만들기(전체 합을 파악한 후, 나눠서 담는다고 생각)
from collections import deque
def solution(queue1, queue2):
    answer = 0
    queue1=deque(queue1) ; queue2=deque(queue2) #큐로 변환해주기(popleft 함수 사용위해)
    q1= sum(queue1) ; q2= sum(queue2)
    que_sum = q1+q2
    l= len(queue1*4)

    if que_sum % 2 != 0: #반반 나눌 수 없으면(2로 나누어 떨어지지 않으면 -1 return)
        return -1

    while True:
        if q1>q2:
            v=queue1.popleft() 
            queue2.append(v)
            q1 -= v ; q2+=v #처리 해준 만큼 sum에서 빼주기 
            answer+=1
        elif q1< q2:
            v=queue2.popleft() 
            queue1.append(v)
            q2 -= v ; q1+=v #처리 해준 만큼 sum에서 빼주기 
            answer+=1
        else:
            break
        if answer == l:
            answer =-1
            break
    return answer
300x250