old/Algorithm

10주차 프로그래머스 2단계 3문제(숫자의 표현/최댓값과 최솟값/최솟값만들기)

hYhY1234 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월 첫째주부터 꾸준히 알고리즘을 제대로 공부해오고 있어서 보람이 있다!!!