알고리즘/카카오 기출

[Python/프로그래머스] 두 큐 합 같게 만들기 - 2022 KAKAO TECH INTERNSHIP

수디sudy 2022. 10. 27. 16:33

❕ 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/118667

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

내 풀이 방법

1. Queue1, Queue2 각각의 sum을 비교 

2. Sum 값이 큰 큐에서 작은 큐로 첫 번째 원소 보내기

3. Sum 값이 같을 때까지 1-2번 반복

4. Queue1과 Queue2의 모든 원소를 바꿨다 원래대로 돌아오는 len(Queue1)*3 번 만큼 1-2를 반복해도 sum 값이 같지 않다면 -1 return

 

첫 번째 코드(실패)

from collections import deque

def solution(queue1, queue2):
    answer = -2
    
    length = len(queue1)
    
    queue1 = deque(queue1)
    queue2 = deque(queue2)
    
    cnt=0
    
    while True:
        if sum(queue1) > sum(queue2):
            temp = queue1.popleft()
            queue2.append(temp)
            cnt += 1
        elif sum(queue1) < sum(queue2):
            temp = queue2.popleft()
            queue1.append(temp)
            cnt += 1
        else:
            break
            
        if cnt > length*3:
            cnt = -1
            break
        
    
    answer = cnt
    
    return answer

 

총 test case 30개중에 63점? 인가 밖에 못맞아서 도대체 왜인가 했더니.. 

While 문이나 for문 안에서 sum 함수(라이브러리) 를 계속 쓰면 시간초과가 난다고 한다..

(queue1,queue2의 개수가 30만개까지라..)

그래서 sum 변수를 각각 while문 밖에서 구한다음 변수로 썼더니 시간초과 안나고 잘 통과했다

 

 

 

전체 코드

from collections import deque

def solution(queue1, queue2):
    answer = 0
    
    length = len(queue1)
    
    queue1 = deque(queue1)
    queue2 = deque(queue2)
    
    sum1 = sum(queue1)
    sum2 = sum(queue2)
    
    while True:
        if answer > length*3:
            return -1
        if sum1 > sum2:
            sum1 -= queue1[0]
            sum2 += queue1[0]
            queue2.append(queue1.popleft())
        elif sum1 < sum2:
            sum1 += queue2[0]
            sum2 -= queue2[0]
            queue1.append(queue2.popleft())
        else:
            return answer
        
        answer+=1