Algorithm

[카카오 코테 2022 | python] 두 큐 합 같게 만들기

삐롱K 2025. 6. 25. 13:17
728x90
반응형

 

Q1) 문제를 어떻게 이해했나요?
A1) 입력: 두 개의 같은 길이의 큐
출력: 각 큐의 합이 같아질 때까지의 최소 작업 횟수
조건: 큐는 FIFO 구조, 어떤 방식으로도 합을 같게 못 맞추면 -1 반환
Q2) 문제를 어떻게 풀 예정인가요?
A2) deque로 큐 구현 → sum(queue1)이 목표의 절반 크기보다 크면 queue1에서 꺼내서 queue2로 이동, 반대도 마찬가지
두 큐의 합이 같아 지는 순간 return
- 최악의 경우를 *4로 안 이휴는 한 원소가 두 큐를 두 번찍 왔다갔다할 수 있으니까, 그 이상으로 갈 수도 있지만 시간 초과 문제와 최적화된 코드라면 그 이상으로 안 갈 것이다.
- while 루프 안에서 sum() 대신 +=, -= 을 해야함.
- O(N)

 

✅ 최적 코드

from collections import deque

def solution(queue1, queue2):
    q1 = deque(queue1)
    q2 = deque(queue2)
    
    sum1 = sum(q1)
    sum2 = sum(q2)
    total = sum1 + sum2
    
    if total % 2 != 0:
        return -1  # 합이 홀수면 나눌 수 없음

    target = total // 2
    max_ops = len(queue1) * 4  # 최악의 경우: 양방향 이동 반복
    count = 0

    while count <= max_ops:
        if sum1 == target:
            return count
        if sum1 > target:
            # q1에서 꺼내서 q2에 넣음
            num = q1.popleft()
            sum1 -= num
            q2.append(num)
            sum2 += num
        else:
            # q2에서 꺼내서 q1에 넣음
            num = q2.popleft()
            sum2 -= num
            q1.append(num)
            sum1 += num
        count += 1
    
    return -1  # 제한 횟수 넘었으면 -1

 

 ➰ 디버깅 코드

from collections import deque

def solution(queue1, queue2):
    queue1 = deque(queue1)
    queue2 = deque(queue2)
    sum1 = sum(queue1)
    sum2 = sum(queue2)
    tot = sum1 + sum2
    max_loop = len(queue1) * 3
    count = 0

    print(f"초기 상태:")
    print(f"  queue1: {list(queue1)} | sum1: {sum1}")
    print(f"  queue2: {list(queue2)} | sum2: {sum2}")
    print("--------------------------------------------------")

    if sum1 == sum2:
        return 0

    while count < max_loop:
        print(f"[{count+1}번째 이동]")

        if sum1 > tot // 2:
            cur = queue1.popleft()
            sum1 -= cur
            queue2.append(cur)
            sum2 += cur
            print(f"  queue1 → queue2: {cur}")
        else:
            cur = queue2.popleft()
            sum2 -= cur
            queue1.append(cur)
            sum1 += cur
            print(f"  queue2 → queue1: {cur}")

        print(f"  queue1: {list(queue1)} | sum1: {sum1}")
        print(f"  queue2: {list(queue2)} | sum2: {sum2}")
        print("--------------------------------------------------")

        count += 1
        if sum1 == sum2:
            print(f"✅ 균형 달성! 이동 횟수: {count}")
            return count

    print("❌ 최대 이동 횟수를 초과하여 균형 불가")
    return -1

 

🐥 내 풀이

from collections import deque

def solution(queue1, queue2):
    queue = deque()
    queue1 = deque(queue1)
    queue2 = deque(queue2)
    sum1 = sum(queue1)
    sum2 = sum(queue2)
    max_loop = len(queue1)*3
    tot = sum(queue1) + sum(queue2)
    count = 0
    
    if sum(queue1) == sum(queue2):
        return 0
    
    while count < max_loop:
        if sum1 > tot//2:
            cur = queue1.popleft()
            sum1 -= cur
            queue2.append(cur)
            sum2 += cur
            count += 1
        else:
            cur = queue2.popleft()
            sum2 -= cur
            queue1.append(cur)
            sum1 += cur
            count += 1
            
        if sum1 == sum2:
            return count
                
    return -1

 

 

😃 추천 강의

 

38군데 합격 비법, 2025 코딩테스트 필수 알고리즘 강의 | 딩코딩코 - 인프런

딩코딩코 | 초보자도 쉽게 이해하는 단계별 설명으로, 막연했던 코딩 테스트가 명확해집니다. 필요한 것만 배우고 바로 실전에 적용하세요!, [사진]🎯38번의 실전 합격으로 완성한 코딩테스트

www.inflearn.com

 

 

기출로 대비하는 개발자 전공면접 [CS 완전정복] 강의 | 개발남노씨 - 인프런

개발남노씨 | CS 전공면접 기출 분석 [운영체제/자료구조/알고리즘/데이터베이스/네트워크]!, 딱 필요한 핵심만 추렸다! 📌CS 전공면접, 이제 자신있게 준비하세요. 수강생 합격수기 🎉  [사진]

www.inflearn.com

 

728x90
반응형