두 큐 합 같게 만들기 _ Lv.2*

2022. 9. 10. 08:512022/Programmers_Kakao 기출

이번 문제는 사실 문제를 보고 아무리 생각해봐도 어떻게 간단하게 풀 수 있지?라는... 두려움?? 때문에 30분 고민해보다가 다른 사람의 풀이를 참고했다. 근데 이거 그래도 한시간 고민 했으면 풀이 방법을 고안하지 않았을까 싶은 문제였다...

 

풀이는 두 큐의 합이 같아지는 elementSum을 구하여 이를 기준으로 합이 큰 큐는 원소를 빼주고, 합이 작은 큐에 그 원소를 넣어주는 방식으로 반복한다. 

 

그런데 이문제는 출제 원소에 따라 시간초과에 걸리는 부분이 있어서 while문의 횟수를 제한한다는 점, sum이 아니라 pop한 값을 더하고/빼는 방식으로 큐의 합을 구한다는 점을 통해 해결하였다.

 

그럼에도 불구하고! 아래의 풀이는 테케 2개에서 시간초과가 나왔다...ㅠ.ㅠ

from collections import deque
def solution(queue1, queue2):
    answer = 0  # 각 큐의 원소 합을 같게 만들기 위해 필요한 작업의 최소 횟수
    elementSum = int((sum(queue1) + sum(queue2)) // 2)
    queue1 = deque(queue1); queue2 = deque(queue2)
    qSum1 = sum(queue1); qSum2 = sum(queue2)

    while answer<(elementSum*3):
        if qSum1 == qSum2:
            return answer

        if qSum1 > elementSum:
            outE = queue1.popleft()
            queue2.append(outE)
            # qSum1 = sum(queue1); qSum2 = sum(queue2)
            qSum1 -= outE; qSum2 += outE
            answer += 1

        else:
            outE = queue2.popleft()
            queue1.append(outE)
            # qSum1 = sum(queue1); qSum2 = sum(queue2)
            qSum1 += outE; qSum2 -= outE
            answer += 1
    return -1

찾아보니 while에서 횟수 제한을 잘못했다. elementSum은 경우에따라 10 또는 더 많이 되기 때문에 시간초과에 걸리게 되는 것이다. 그래서 처음 queue1, 2의 길이의 3배로 변경하니 통과할 수 있었다.

from collections import deque
def solution(queue1, queue2):
    answer = 0  # 각 큐의 원소 합을 같게 만들기 위해 필요한 작업의 최소 횟수
    queue1 = deque(queue1); queue2 = deque(queue2); lenQueue = len(queue1)
    qSum1 = sum(queue1); qSum2 = sum(queue2)
    elementSum = int((qSum1 + qSum2) // 2)

    while answer<=(lenQueue*3):
        if qSum1 == qSum2:
            return answer

        if qSum1 > elementSum:
            outE = queue1.popleft()
            queue2.append(outE)
            qSum1 -= outE; qSum2 += outE
            answer += 1

        else:
            outE = queue2.popleft()
            queue1.append(outE)
            qSum1 += outE; qSum2 -= outE
            answer += 1
        print(queue1, queue2, answer)

    print(answer < len(queue1)*3)
    return -1

'2022 > Programmers_Kakao 기출' 카테고리의 다른 글

크레인 인형뽑기 게임 _ Lv.1  (0) 2022.09.09
성격 유형 검사하기 _ Lv.1  (0) 2022.09.06
키패드 누르기 _ Lv.1  (0) 2022.09.06
숫자 문자열과 영단어 _ Lv.1  (0) 2022.09.05
신규 아이디 추천 _ Lv.1  (0) 2022.09.04