본문 바로가기
프로그래밍/알고리즘

프로그래머스 두 큐 합 같게 만들기 파이썬

by 숙님 2023. 3. 10.
728x90

문제 

 

프로그래머스

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

programmers.co.kr

길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다.
큐는 먼저 집어넣은 원소가 먼저 나오는 구조입니다. 이 문제에서는 큐를 배열로 표현하며, 원소가 배열 앞쪽에 있을수록 먼저 집어넣은 원소임을 의미합니다. 즉, pop을 하면 배열의 첫 번째 원소가 추출되며, insert를 하면 배열의 끝에 원소가 추가됩니다. 예를 들어 큐 [1, 2, 3, 4]가 주어졌을 때, pop을 하면 맨 앞에 있는 원소 1이 추출되어 [2, 3, 4]가 되며, 이어서 5를 insert 하면 [2, 3, 4, 5]가 됩니다.

 

 

해결 코드 

#시간초과 확률을 낮춰주는 deque를 사용 
from collections import deque

def solution(queue1, queue2):
	#queue1,2를 deque로 넣음 
    q1, q2 = deque(queue1), deque(queue2)
    #합이 같은지 비교해야하므로 sum()으로 넣기 
    s1, s2 = sum(q1), sum(q2)
    #queue1, 2의 모든 원소를 바꾸면 queue1의 길이의 2배 횟수 필요, 원래대로 다시할 길이를 정의
    count, max_count = 0, len(q1) * 3
	
    #합이 같다면 0을 리턴 
    if s1 == s2:
        return 0
    elif (s1 + s2) % 2 == 1:  # 같아질 수 없음
        return -1

    while True:
        if s1 > s2:
        	#큰거에서 원소를 빼서 
            i = q1.popleft()
            #작은 것에 넣어줌 
            q2.append(i)
            s1 -= i
            s2 += i
            count += 1
        elif s2 > s1:
            i = q2.popleft()
            q1.append(i)
            s2 -= i
            s1 += i
            count += 1
        else:
            break
        if count == max_count:
            return -1

    return count

문제 정의

- queue1의 값과 queue2의 값을 같게 만들기 

 

배운 점 

- deque를 사용하면 시간초과가 안날 확률이 높다 

- list의 pop()을 사용하는 것보다 deque의 popleft()를 사용하는 것이 좋다 

후기 

알고리즘 오프라인 스터디원들이랑 5시간동안 코테를 풀었다 이 문제도 그중 하나이다 

나는 2문제(level1,2)를 맞췄다 

5시간동안 집중하는 건 시간이 빨리 가는 것 같으면서도 힘들다(풀고 싶지만 못 푸는 것은 큰 고통....)

모든 문제를 쓱쓱 풀 정도의 실력이 되고 싶다

댓글