https://school.programmers.co.kr/learn/courses/30/lessons/118667
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from collections import deque
def solution(queue1, queue2):
q1 = sum(queue1)
q2 = sum(queue2)
s = q1 + q2
target = s/2
if q1 == target:
return 0
queue1 = deque(queue1)
queue2 = deque(queue2)
n = 0
a = 0
while 1 :
a += 1
if a>300000:
return -1
if q1 > q2:
q1_0 = queue1.popleft()
queue2.append(q1_0)
if q1_0 > target:
return -1
q1 = q1 - q1_0
q2 = q2 + q1_0
n += 1
if q2 == target:
return n
else:
q2_0 = queue2.popleft()
if q2_0 > target:
return -1
queue1.append(q2_0)
q1 = q1 + q2_0
q2 = q2 - q2_0
n +=1
if q1 == target:
return n
문제가 두 큐 합 만들기인 만큼 큐를 사용하여 풀었다.
1. q1의 합과 q2의 합을 구한다. ( 그래야 목표값을 알 수 있기 때문)
(이때 q1이나 q2 중 아무거나 목표값에 다다르면 정답!)
2. 목표값을 구한다.
3. 만약 목표값이 이미 도달해 있다면 0 리턴 ( 처음부터 정답이 입력될 수 있기 때문)
4. while문 안에서 동작
4-1. q1 과 q2 중 더 큰 값에서 popleft 해서 작은 값에 append 한다.
4-2. append 했을 때의 값이 target과 같으면 n 리턴
4-3. 4-1과 4-2 연산을 300000번 이상 했을 땐, 이미 했던 연산을 반복하고 있다는 뜻으로 답이 없다. 따라서 -1 리턴
문제의 목표는 각각의 큐의 합이 같게 되어야 한다.
그러려면 각각의 큐의 합을 알아야 하며, 모든 큐의 합을 알아야 한다.
두 큐의 합이 다르다면 , 둘 중 하나의 큐는 target 보다 클 것이고, 다른 하나는 target보다 작을 것이다.
그렇다면 큰 큐에서 popleft를 한 후 작은 큐에 append하면 된다.
이 과정에서 최대한 연산의 수를 줄여야한다.
그러려면 sum() 연산을 최대한 줄여야 한다.
따라서
1. sum 연산은 최초 두 큐의 합을 계산 할 때만 사용한다 ( 그래야 target값을 찾을 수 있기 때문)
2. while문 안에서의 sum() 연산을 피하기 위해 각각의 큐의 합을 생성해놓고, 단순연산으로 갱신하는 방법을 사용한다.
'알고리즘 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 [Level 2] (python 파이썬) (0) | 2023.02.08 |
---|---|
[프로그래머스] 등산코스 정하기 [Level 3] (python 파이썬) (2) | 2023.02.07 |
[프로그래머스] 코딩 테스트 공부 [Level 3] (python 파이썬) (0) | 2023.02.06 |
[프로그래머스] 성격 유형 검사하기 [Level 1] (python 파이썬) (4) | 2023.01.29 |
[프로그래머스] 타겟 넘버 [Level 2] (python 파이썬) (DFS,BFS) (1) | 2023.01.26 |