728x90
반응형
1. 문제 설명
2. 풀이과정
해당 문제는 두 큐의 원소를 제거하고 추가하는 작업을 반복하면서 두 큐의 합이 동일해지도록 만드는 문제이다.
큐의 구조에 따라 제일 앞 원소를 빼서 제일 뒤에 추가한다.
처음에 두 큐의 원소 개수는 동일하다. 하여 두 큐가 작업을 수행하다가 작업을 처음 큐의 원소 개수에 4배만큼 수행하게 되면 처음 큐로 돌아오게 된다.
따라서 작업 횟수는 처음 큐의 원소 개수에 4배보다 작아야 하며 이와 같거나 커질 경우에는 절대로 각 큐의 원소 합을 같게 만들 수 없는 경우인 것이다.
또한 매 작업 수행 후 두 큐의 원소 합을 sum() 함수로 계산하면 많은 시간이 소요되므로 시간을 최소화하기 위해 처음에만 합을 계산하고 이후에는 제거하고 추가하는 값을 그때마다 더하고 빼주는 방식으로 계산하였다.
- popleft() 함수를 사용하기 위해 두 큐를 deque 자료구조로 바꿔 진행한다. deque 자료구조를 사용하기 위해 deque 모듈을 불러온다. from collections import deque
- 두 큐를 deque 자료구조로 바꾼다. queue1 = deque(queue1) queue2 = deque(queue2)
- 작업을 진행할 때마다 두 큐의 원소 합을 sum() 함수로 구하면 많은 시간이 소요된다. 하여 두 큐의 합을 처음에만 저장해 둔다. sum1 = sum(queue1) sum2 = sum(queue2)
- 각 큐의 원소가 원래 큐의 모습으로 돌아오는 작업의 횟수는 전체 원소 개수의 2배이고, 이는 처음 큐 원소의 개수에 4배이다. 최대 반복 가능 횟수를 저장해 둔다. size = len(queue1) * 4
- 작업의 최대 반복 가능 횟수만큼 반복하며 for _ in range(size)
- 만약 두 큐의 원소 합이 같으면 종료한다. if (sum1 == sum2): break
- 만약 첫 번째 큐의 합이 더 크면 if (sum1 > sum2)
- 첫 번째 큐의 원소를 제거하고 이를 저장한다. num1 = queue1.popleft()
- 제거한 원소 값만큼 합에도 빼준다. sum1 -= num1
- 두 번째 큐에 해당 원소를 추가한다. queue2.append(num1)
- 추가한 원소 값만큼 합에도 더해준다. sum2 += num1
- 반면에 두 번째 큐의 합이 더 크면 else
- 두 번째 큐의 원소를 제거하고 이를 저장한다. num2 = queue2.popleft()
- 제거한 원소 값만큼 합에도 빼준다. sum2 -= num2
- 첫 번째 큐에 해당 원소를 추가한다. queue1.append(num2)
- 추가한 원소 값만큼 합에도 더해준다. sum1 += num2
- 해당 작업이 1회 수행되었으므로 전체 작업 수행 횟수에 1을 더해준다. answer += 1
- 반복문이 종료된 후, 만약 작업의 횟수가 최대 반복 가능 횟수와 같거나 크면 if (answer >= size)
- 절대로 각 큐의 원소 합을 같게 만들 수 없는 경우이므로 -1을 저장한다. answer = -1
반응형
3. 소스코드
from collections import deque
def solution(queue1, queue2):
answer = 0
queue1 = deque(queue1)
queue2 = deque(queue2)
sum1 = sum(queue1)
sum2 = sum(queue2)
size = len(queue1) * 4
for _ in range(size):
if (sum1 == sum2):
break
if (sum1 > sum2):
num1 = queue1.popleft()
sum1 -= num1
queue2.append(num1)
sum2 += num1
else:
num2 = queue2.popleft()
sum2 -= num2
queue1.append(num2)
sum1 += num2
answer += 1
if (answer >= size):
answer = -1
return answer
728x90
반응형
'프로그래머스 > Python' 카테고리의 다른 글
[프로그래머스] 불량 사용자 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.04 |
---|---|
[프로그래머스] 스티커 모으기(2) - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.11.01 |
[프로그래머스] 124 나라의 숫자 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.30 |
[프로그래머스] 연속된 부분 수열의 합 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.28 |
[프로그래머스] 큰 수 만들기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.24 |
[프로그래머스] 삼각 달팽이 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.22 |
[프로그래머스] 베스트앨범 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.20 |
[프로그래머스] 쿼드압축 후 개수 세기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.18 |