[프로그래머스][Python] 두 큐의 합 같게 만들기

2023. 11. 14. 19:17·IT/BOJ 문제정리

문제 설명

길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다.

큐는 먼저 집어넣은 원소가 먼저 나오는 구조입니다. 이 문제에서는 큐를 배열로 표현하며, 원소가 배열 앞쪽에 있을수록 먼저 집어넣은 원소임을 의미합니다. 즉, pop을 하면 배열의 첫 번째 원소가 추출되며, insert를 하면 배열의 끝에 원소가 추가됩니다. 예를 들어 큐 [1, 2, 3, 4]가 주어졌을 때, pop을 하면 맨 앞에 있는 원소 1이 추출되어 [2, 3, 4]가 되며, 이어서 5를 insert하면 [2, 3, 4, 5]가 됩니다.

다음은 두 큐를 나타내는 예시입니다.

queue1 = [3, 2, 7, 2]
queue2 = [4, 6, 5, 1]

두 큐에 담긴 모든 원소의 합은 30입니다. 따라서, 각 큐의 합을 15로 만들어야 합니다. 예를 들어, 다음과 같이 2가지 방법이 있습니다.

  1. queue2의 4, 6, 5를 순서대로 추출하여 queue1에 추가한 뒤, queue1의 3, 2, 7, 2를 순서대로 추출하여 queue2에 추가합니다. 그 결과 queue1은 [4, 6, 5], queue2는 [1, 3, 2, 7, 2]가 되며, 각 큐의 원소 합은 15로 같습니다. 이 방법은 작업을 7번 수행합니다.
  2. queue1에서 3을 추출하여 queue2에 추가합니다. 그리고 queue2에서 4를 추출하여 queue1에 추가합니다. 그 결과 queue1은 [2, 7, 2, 4], queue2는 [6, 5, 1, 3]가 되며, 각 큐의 원소 합은 15로 같습니다. 이 방법은 작업을 2번만 수행하며, 이보다 적은 횟수로 목표를 달성할 수 없습니다.

따라서 각 큐의 원소 합을 같게 만들기 위해 필요한 작업의 최소 횟수는 2입니다.

길이가 같은 두 개의 큐를 나타내는 정수 배열 queue1, queue2가 매개변수로 주어집니다. 각 큐의 원소 합을 같게 만들기 위해 필요한 작업의 최소 횟수를 return 하도록 solution 함수를 완성해주세요. 단, 어떤 방법으로도 각 큐의 원소 합을 같게 만들 수 없는 경우, -1을 return 해주세요.

제한 사항

  • 1 ≤ queue1의 길이 = queue2의 길이 ≤ 300,000
  • 1 ≤ queue1의 원소, queue2의 원소 ≤ 109
  • 주의: 언어에 따라 합 계산 과정 중 산술 오버플로우 발생 가능성이 있으므로 long type 고려가 필요합니다

솔루션: deque

from collections import deque

def solution(queue1, queue2):
    answer = -1
    q1 = deque(queue1)
    q2 = deque(queue2)
    s1 = sum(q1)
    s2 = sum(q2)

    n = len(queue1) * 4
    for i in range(n):
        if s1 < s2:
            temp = q2.popleft()
            q1.append(temp)
            s2 -= temp
            s1 += temp
        elif s1 > s2:
            temp = q1.popleft()
            q2.append(temp)
            s1 -= temp
            s2 += temp
        else:
            answer = i
            break

    return answer

두 큐의 길이가 같은면서 합이 같은 경우를 찾기 위해서는, 두 큐 중 합이 큰 큐에서 작은 큐로 숫자를 옮겨주는 작업을 반복하면 된다. 수학적으로 맞는지는 모르겠지만 직감적으로 될 것 같은 느낌이 들어서 그렇게 풀었다.

두 큐의 모든 원소를 바꾸면 queue의 길이 * 2만큼의 횟수가 필요하다 생각했다. 그러나 queue의 길이 * 2로 하면 1번 테스트케이스에서 틀린다. 원래의 큐로 돌아올 때까지 원소를 교환하도록 queue의 길이 * 4로 하면 통과한다.

'IT > BOJ 문제정리' 카테고리의 다른 글

[복기] 12865번: 평범한 배낭  (0) 2023.11.21
[프로그래머스][JS] n^2 배열 자르기  (0) 2023.09.19
[프로그래머스][JS] 할인 행사  (0) 2023.09.18
[프로그래머스][JS] N개의 최소공배수  (0) 2023.09.13
[프로그래머스][JS] 피보나치 수  (1) 2023.09.09
'IT/BOJ 문제정리' 카테고리의 다른 글
  • [복기] 12865번: 평범한 배낭
  • [프로그래머스][JS] n^2 배열 자르기
  • [프로그래머스][JS] 할인 행사
  • [프로그래머스][JS] N개의 최소공배수
KimCookieYa
KimCookieYa
무엇이 나를 살아있게 만드는가
  • KimCookieYa
    쿠키의 주저리
    KimCookieYa
  • 전체
    오늘
    어제
    • 분류 전체보기 (574) N
      • 혼잣말 (88) N
      • TIL (2)
      • 커리어 (24)
        • Sendy (21)
        • 외부활동 기록 (2)
      • 프로젝트 (186)
        • 티스토리 API (5)
        • 코드프레소 체험단 (89)
        • Web3 (3)
        • Pint OS (16)
        • 나만무 (14)
        • 대회 (6)
        • 정글 FE 스터디 (16)
        • MailBadara (12)
        • github.io (1)
        • 인공지능 동아리, AID (5)
        • 졸업과제 (18)
        • OSSCA 2024 (1)
      • 크래프톤 정글 2기 (80)
      • IT (168) N
        • 코딩 (4)
        • CS (18)
        • 에러 (5)
        • 블록체인 (23)
        • Front-End (39) N
        • 알고리즘&자료구조 정리 (3)
        • 코딩테스트 (3)
        • BOJ 문제정리 (41)
        • WILT (12)
        • ML-Agents (4)
        • 강화학습 (1)
        • Android (0)
        • LLM (2)
      • 전공 (1)
        • 머신러닝 (1)
      • 자기계발 (20)
        • 빡공단X베어유 (2)
        • 독서 (15)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Velog
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    OS
    코드프레소
    Pint OS
    핀토스
    MailBadara
    해커톤
    부산대
    JavaScript
    니어프로토콜
    리액트
    자바스크립트
    블록체인
    나만무
    사이드프로젝트
    RNN
    파이썬
    졸업과제
    react
    프로그래머스
    크래프톤정글
    글리치해커톤
    딥러닝
    센디
    numpy
    Flutter
    알고리즘
    머신러닝
    NEAR Protocol
    docker
    pintos
  • hELLO· Designed By정상우.v4.10.3
KimCookieYa
[프로그래머스][Python] 두 큐의 합 같게 만들기
상단으로

티스토리툴바