DOTY

3) 프로그래머스 Lv2 - 두 큐 합 같게 만들기 본문

Algorithm/Data Structure

3) 프로그래머스 Lv2 - 두 큐 합 같게 만들기

증식세포 2023. 3. 22. 16:32
728x90
반응형

코딩테스트 연습 - 두 큐 합 같게 만들기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr


시간 초과 해결에 애쓴 문제

#include <bits/stdc++.h>

using namespace std;

int solution(vector<int> queue1, vector<int> queue2) {
    int answer = -2;
    int cnt = 0;
    int q1 = 0;
    int q2 = 0;
    int queue_size = queue1.size();
    long sum1 = 0;
    long sum2 = 0;
    
    for(int i = 0; i < queue_size; i++) {
        sum1 += queue1[i];
        sum2 += queue2[i];
    }
    if((sum1 + sum2) % 2 != 0) {
        return -1;
    }
    queue_size <<= 2;
    while(sum1 != sum2 && queue_size-1 != cnt && q1 != queue_size && q2 != queue_size) {
        if(sum1 > sum2) {
            queue2.push_back(queue1[q1]);
            sum1 -= queue1[q1];
            sum2 += queue1[q1];
            q1++;
        }
        else if(sum1 < sum2) {
            queue1.push_back(queue2[q2]);
            sum2 -= queue2[q2];
            sum1 += queue2[q2];
            q2++;
        }
        cnt++;
    }
    if(sum1 != sum2) {
        answer = -1;
    }
    else {
        answer = cnt;
    }
    
    return answer;
}

생각보다 숫자가 엄청 컸다. 그래서 long type이 필요했다.

숫자가 이동하는데 최대 이동 횟수초기 큐의 크기에 4배에 해당하는 크기다. (극단적으로 쏠려있는 경우도 있기 때문)

듣기로는 곱하기는 시간을 많이 잡아먹는다고 들었다. 그래서 "<<"연산자를 활용하여 2칸 shift시키면 4배가 되는 것을 사용했다.

 

이 다음이 문제였는데 초반에는 vector로 되어 있는 큐 였기 때문에 erase를 쓰려고 했지만 계속 시간 초과.

이유는 erase함수는 최악 O(n)의 시간복잡도를 가지고 있으므로 생각보다 오래 걸린다. 

따라서 이를 제거. 

 

대체로 queue1과 queue2의 각 배열값을 하나씩 이동 시키는 방법을 선택했다.

왜냐하면 각 큐의 합은 sum1과 sum2에 저장되기 때문이다.

 

결과는 훨신 빨라졌다.

 

좋아~

 

728x90
반응형

'Algorithm > Data Structure' 카테고리의 다른 글

6) LeetCode - Majority Element  (0) 2024.09.03
5) LeetCode - Remove Element  (0) 2024.09.02
4) LeetCode - Merge Sorted Array  (0) 2024.05.29
2) 백준 1874 - 스택 수열  (0) 2023.01.14
1) 백준 4949 - 균형잡힌 세상  (0) 2023.01.13
Comments