https://school.programmers.co.kr/learn/courses/30/lessons/118667?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이번에는 큐를 이용한 문제였다.
여기서 시간복잡도를 고려하여 코드를 짜는게 어려웠다.
처음 시간초과가 발생한 이유는 sum 때문이었는데, sum은 시간복잡도가 O(n)이기 때문에 내가 처음 작성한 것은 시간복잡도가 초과할 수 밖에 없는 구조였다.
이를 고려하기 위해 계속 업데이트한 큐의 sum을 구하는게 아니라 각각 처음 구한 합에서 popleft() 한값만을 빼주고, append한 값을 더해주는 식으로 구성했다.
from collections import deque
"""
시간 초과를 막기 위해, 각 큐에서 더하고 뺀값만 합쳐준다.
sum은 O(n)의 시간복잡도를 가지기 때문에 시간초과!
"""
def solution(queue1, queue2):
# 큐로 바꿈
queue1 = deque(queue1)
queue2 = deque(queue2)
# 합을 비교하기 위해 각각 합을 구한다.
sum1 = sum(queue1)
sum2 = sum(queue2)
# 합을 같게 만들기 위한 작업의 최소 횟수
count = 0
# 큐의 최대의 길이인 300000만큼 실행 -> 불가하면 -1 반환
for _ in range(300000):
# 합이 같으면 최소 횟수 반환
if sum1 == sum2:
return count
# queue1의 합이 더 크다면, queue1의 원소 추출
if sum1 > sum2:
a = queue1.popleft()
queue2.append(a)
sum1 -= a
sum2 += a
# queue2의 합이 더 크다면, queue2의 원소 추출
elif sum1 < sum2:
a = queue2.popleft()
queue1.append(a)
sum1 += a
sum2 -= a
# 교환 후 횟수 증가
count += 1
return -1
'👩💻 코테 공부 > 코테 공부' 카테고리의 다른 글
| [코테 - py] 최대 힙 (0) | 2024.07.31 |
|---|---|
| [코테 - py] 최소 힙 (0) | 2024.07.31 |
| [코테 - py] 과제 진행하기 (0) | 2024.07.29 |
| [코테 - py] 테이블 해시 함수 (0) | 2024.07.27 |
| [코테 - py] 베스트 앨범 (0) | 2024.07.27 |