ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10주차 프로그래머스 2단계 3문제(숫자의 표현/최댓값과 최솟값/최솟값만들기)
    old/Algorithm 2020. 8. 9. 15:34
    728x90

    이번주의 목표

    요즘 다른 자격증 공부를 하느라 바쁘지만 그래도 쉬운 문제라도 감안떨어지게 매주 어떤식으로든 풀려고 한다. 이번주는 

    숫자의 표현/최댓값과 최솟값/최솟값만들기 이렇게 세문제를 풀어보려고 한다. 9월부터는 좀더 본격적으로 어려운 문제들을 다시 풀어보려고 한다. 

     

     

    숫자의 표현

    풀이

    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    int solution(int n) {
        int answer = 0;
        int s = 0; 
        vector<int> a(1, 0); // a[0] = 0;
        for(int i = 1; i <= 10000; i++){
            s += i;
            a.push_back(s);
        }
        for(int i = n; i >= 1; i--){
            for(int j = i-1; j >= 0; j--){
                if(a[i] - a[j] == n){
                    answer++;
                    break;
                }else if(a[i] - a[j] > n){
                    // 다음으로 가도 더 커지기 때문에, 사이값이 더 크면 브레이크
                    break;
                }
            }
        }
        return answer;
    }

    1) 합의 누적을 구한다. 즉 a[0] = 0, a[1] = 1, a[2] = a[1] + 2, a[n] = a[n-1] + n

     

    2) 그리고 n일때부터 포문을 반복하는데, 

    각 루프에서는 a[i] - a[i-1] ,  a[i] - a[i-2], .... a[i] - a[1], a[i] - a[0] 을 체크한다.

    이때 n과 같으면 경우를 찾은거라 1을 올리고 루프를 빠져나온다. 

     

    3) 여기까지만 해도 정답은 다 맞지만 효율이 구리다.

    조건을 하나 더 추가해서  a[i] - a[j] > n ( i > j >= 0) 이면 브레이크 한다. 왜냐하면 어차피 더 계산해봤자 값이 점점 커질거라 구할 필요가 없기 때문이다. 

     

    최댓값과 최솟값

    풀이

    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    string solution(string s) {
        string answer = "";
        string cur = "";
        int flag = false;
        int mmax = 0; 
        int mmin = 0; 
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' '){
                // cout << cur << "\n";
                int temp = stoi(cur);
                if(flag == false){
                    // 첨 대입
                    mmax = temp;
                    mmin = temp;
                    flag = true;
                }else{
                    if(mmax < temp){
                        mmax = temp;
                    }
                    if(mmin > temp){
                        mmin = temp;
                    }
                }
                cur = "";
            }else{
                cur += s[i];
            }
        }
        // cout << cur << "\n";
        int temp = stoi(cur);
        if(mmax < temp){
            mmax = temp;
        }
        if(mmin > temp){
            mmin = temp;
        }
        // cout << mmin << " " << mmax;
        answer = to_string(mmin) + " " + to_string(mmax);
        return answer;
    }

    이건 글자짜리는게 귀찮았던 문제. 

     

     

     

    최솟값만들기

    풀이

    #include <iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    int solution(vector<int> A, vector<int> B)
    {
        int answer = 0;
    
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        sort(A.begin(), A.end());
        sort(B.begin(), B.end());
        
        int s = A.size();
        for(int i = 0; i < s; i++){
            answer += (A[i] * B[s-i-1]);
            // cout << A[i] << " " << B[s-i-1] << "\n";
        }
    
        return answer;
    }

    이건 어려운가 했다가 정말 쉬운 문제란걸 좀있다 깨달았다. 

     

     

    후기

    이번주는 보안기사를 하느라 바쁜데, 이제야 프로그래머스의 2단계 문제가 진짜 2단계 수준이라 그래도 시간을 많이 쓰지 않고 간단히 세문제를 다 풀었다. 9월초까지는 이렇게라도 쉬운 문제라도 좀 풀다가, 고난도 문제로 다시 복귀해야겠다. 쉬운 문제를 쉽게 풀줄아는것도 중요하니 꾸준히 갈고 닦아야겠다. 

     

    그래도 10주, 정확히는 3월 첫째주부터 꾸준히 알고리즘을 제대로 공부해오고 있어서 보람이 있다!!!

    댓글

Designed by Tistory.