Algorithm
[프로그래머스] 두 큐 합 같게 만들기 (python)
salmon16
2024. 1. 3. 17:07
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/118667
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 방법
처음에는 두 큐의 합이 같게 만드는 알고리즘이 있을까 생각해 봤는데 떠오르지 않았다.
그래서 그냥 완전 탐색으로 합이 작은 쪽에서 큰 쪽으로 원소를 이동해 가며 특정 횟수가 넘으면 return -1 하게 풀어야겠다고 생각했다.
처음에는 sum 메서드를 활용해서 매번 loop마다 합을 구해서 비교했는데 이러면 sum 메서드 때문에 시간 초과 된다.
그래서 변수 total1, total2를 활용해서 두 배열의 합을 구해서 비교를 했다.
또 그냥 배열을 사용해서 pop(0) 메서드를 이용했는데 이러면 맨 앞 원소를 제거 후 원소를 한 칸씩 왼쪽으로 옮겨야 하므로 시간 복잡도가 O(n)이 된다. 그러므로 리스트를 deque로 변환 후 popleft()를 수행하면 O(1)으로 줄일 수 있다.
그리고 최대 횟수는 모든 원소가 바뀌었다가 다시 원상 복구할 때 수행해야 하는 수가 (전체 배열의 수 * 2)가 되므로
(전체 배열의 수 * 2)를 최대 횟수로 설정했다.
from collections import deque
def solution(queue1, queue2):
queue1 = deque(queue1)
queue2 = deque(queue2)
answer = -2
cnt = 0
num_num = len(queue1) + len(queue2) ## 총 배열의 길이
num_num = num_num * 2
total1 = sum(queue1)
total2 = sum(queue2)
if (total1 + total2) % 2 != 0:
return -1
while True:
if cnt > num_num:
return -1
if total1 > total2:
temp = queue1.popleft()
queue2.append(temp)
total1 -= temp
total2 += temp
elif total1 < total2:
temp = queue2.popleft()
queue1.append(temp)
total1 += temp
total2 -= temp
else:
break;
cnt += 1
return cnt