일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- RGB거리2
- 최소스패닝트리
- 두큐합같게만들기
- 그래프탐색
- 트리의지름
- BFS
- 알고리즘
- 17404
- 징검다리건너기
- 위상정렬
- 벽부수고이동하기
- 백준
- 자물쇠와열쇠
- 다익스트라
- 파이썬
- 프로그래머스
- 도넛과막대그래프
- 프림알고리즘
- [1차]캐시
- 거리두기확인하기
- 구현
- 섬연결하기
- 최단경로
- 큐
- 파괴되지않은건물
- DFS
- 사이클게임
- DP
- 이모티콘할인행사
- javascript
- Today
- Total
블로그 이름 뭐로 하지
[알고리즘] 프로그래머스 - 두 큐 합 같게 만들기 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/118667
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
처음에 봤을 때 일반적인 구현은 금방 할 것 같았는데 -1를 출력하는 경우를 어떻게 판단할지가 고민이었다.
나는 각 큐의 길이가 300,000 이하이므로 600,000 번 이상 교환을 했는데도 두 큐의 합이 같지 않다면 합을 같게 만들 수 없다고 판단하고 -1을 리턴해주는 식으로 해줬다. 정답처리는 됐지만 이 숫자를 어떤 기준으로 잡아야하는지는 모르겠다...
다른 사람들을 어떻게 지정했을까 궁금해서 봤는데... 1,000,000번도 있고, 300,000번도 있고.. 다들 제각각 이더라. 흠 또.. 4*len(queue1) + 1 로 잡은 분들도 있고 , 2* len(queue1) * len(queue2) 로 잡은 분들도 있던데 .. 어떻게 잡아야 정확한 풀이인건지를 모르겠다 (아는 분 계시면 댓글 남겨주세요...)
일반적인 상황에서의 구현은 간단하다. 처음에 각 큐의 sum을 구한다. 그 뒤로도 sum함수를 통해 구하려고 했는데 시간 초과가 날 것 같아서 while 문 내에서는 처음 구한 sum에서 더하고 빼주는 방식으로 합을 구했다. 아마 sum함수를 썼으면 시간 초과가 났을 것 같다...! 합이 더 큰 큐에서 원소를 뽑아 넣는 방식으로 구현하면 최소 횟수로 같은 합 큐를 만들 수 있다.
정답 코드
from collections import deque
def solution(queue1, queue2):
answer = 0
q1 = deque(queue1)
q2 = deque(queue2)
number = sum(q1) + sum(q2)
if number % 2:
return -1
q1_sum = sum(q1)
q2_sum = sum(q2)
while q1_sum != q2_sum:
if answer > 600000:
return -1
if q1_sum < q2_sum:
answer += 1
a = q2.popleft()
q1.append(a)
q1_sum += a
q2_sum -= a
else:
answer += 1
a = q1.popleft()
q2.append(a)
q2_sum += a
q1_sum -= a
return answer
'알고리즘' 카테고리의 다른 글
[컴퓨터구조] CPU 작동 원리 (1) | 2024.01.03 |
---|---|
[알고리즘] 프로그래머스 - 프로세스 (0) | 2024.01.03 |
[알고리즘] 백준 1504 - 특정한 최단 경로 (0) | 2024.01.02 |
[알고리즘] 백준 1238 - 파티 (0) | 2024.01.02 |
[알고리즘] 프로그래머스 - 기능개발 (0) | 2024.01.01 |