[알고리즘 + 자료구조]/[프로그래머스]

프로그래머스 연속 부분 수열 합의 개수

Hevton 2023. 8. 3. 00:02
반응형

머리로는 어떻게 해야되는지 알겠는데, 진짜 코드로 로직을 짜는게 안된다.

#include <string>
#include <vector>
#include <set>
#include <queue>
#include <iostream>

using namespace std;

int solution(vector<int> elements) {
    
    int len = elements.size();
    set<int> results;
    
    
    elements.insert(elements.end(), elements.begin(), elements.end());
    
    
    for(int windowSize = 1; windowSize <= len; windowSize++) {
        
        int index = 0;
        int result = 0;
        queue<int> que;

        
        while(que.size() < windowSize) {
            que.push(elements[index]);
            result += elements[index];
            index++;
        }
        
        results.insert(result);
        
        for(int i = 0; i < len; i++) {
            que.push(elements[index]);
            result += elements[index];
            index++;
            
            result -= que.front();
            que.pop();
            results.insert(result);
        }
    }
    
    

    
    // for(auto x : results) {
    //     cout << x << "\n";
    // }
    return results.size();
}

 

 

조금 더 리팩토링 해봤다

#include <string>
#include <vector>
#include <set>
#include <queue>

using namespace std;

int solution(vector<int> elements) {
    
    int len = elements.size();
    set<int> results;
    
    
    elements.insert(elements.end(), elements.begin(), elements.end());
    
    
    for(int windowSize = 1; windowSize <= len; windowSize++) {
        
        int index = 0;
        int result = 0;
        queue<int> que;
        
        for(int i = 0; i < len; i++) {
            
            while(que.size() < windowSize) {
                que.push(elements[index]);
                result += elements[index];
                index++;
            }
            results.insert(result);
            
            result -= que.front();
            que.pop();
        }
    }
    
    return results.size();
}

 

하지만 역시나 다른 사람들이 푼 풀이에 비하면 별볼일 없다.

이걸 나는 슬라이딩 윈도우 관점에서 봤는데, 어떤분은 각 자리에서 elements 길이만큼 더해가며 경우를 구하는 분도 있었다.

#include <string>
#include <vector>
#include <set>

using namespace std;

int solution(vector<int> elements) {
    int answer = 0;
    
    int len = elements.size();
    set<int> results;
    
    
    elements.insert(elements.end(), elements.begin(), elements.end());
    
    
    for(int i = 0; i < len; i++) {
        
        int result = 0;
        
        for(int j = i; j < i + len; j++) {
            
            result += elements[j];
            
            results.insert(result);
            
            
        }
        
    }
    
    return results.size();
}

 

이렇게 푸신 것이다. 역시나 매몰되면 안된다. 사고력이 제한이 된다.

 

머리 쓰는 시간을 자주 가져야겠다. 사고력이 필요하다. 둔해졌다.

반응형