본문 바로가기

Development/CodingTest

[2022 KAKAO TECH INTERNSHIP] 두 큐 합 같게 만들기 Python 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/118667

 

프로그래머스

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

programmers.co.kr

문제 접근

  • 핵심은 총합이 큰 queue에서 작은 queue로 요소가 이동해야 함
  • 반복문을 돌면서 한쪽 큐로 옮겨보고, 합해보고, 다시 비교해 보고 같아지거나 최대 카운트 벗어나면 break

시간 초과

시간 초과에 대해 고민을 했는데.. 

  • sum() 함수 연산을 최소화 (변수에 저장하고 연산하는 식으로)
  • 최대 연산 수를, 하나의 queue가 싹 빠지고 다시 원래 queue로 돌아오는 경우라 생각해서 len(queue1) * 3으로 설정
  • 양쪽 queue의 합이 같아지면 break
  • 반복문 들어가기 전에 처음부터 정답을 return 할 수 있는지 코드 추가

코드

from collections import deque

def solution(queue1, queue2):
    answer = -1
    queue1, queue2 = deque(queue1), deque(queue2)
    sum_que1, sum_que2 = sum(queue1), sum(queue2)
    target = sum_que1 + sum_que2
    
    if sum_que1 == sum_que2:
        return 0
    if target % 2 != 0:
        return -1
    
    cnt = 0
    max_cnt = len(queue1) * 3
    for i in range(max_cnt):
        if sum_que1 < sum_que2:
            value = queue2.popleft()
            queue1.append(value)
            sum_que1 += value
            sum_que2 -= value
            cnt += 1

        elif sum_que2 < sum_que1:
            value = queue1.popleft()
            queue2.append(value)
            sum_que2 += value
            sum_que1 -= value
            cnt += 1
        else:
            break
        
    return cnt if cnt != max_cnt else -1