old/Algorithm

9주차 알고리즘 매주 세문제 풀기(튜플, 다음 큰 숫자, 땅따먹기, 포켓몬)

hYhY1234 2020. 8. 4. 22:38
728x90

이번주 풀 문제!

튜플, 다음 큰 숫자, 땅따먹기 문제 풀기

요즘에는 운동하느라 퇴근하고 공부할시간이 많이 없는데 그래도 최대한 주말을 이용해서라도 풀어보려고 노력중이다. 

그래도 9주차까지 온 내가 대견하다! 그래도 몇달째 주말이든 평일이든 알고리즘을 계속 공부한다는게 중요한거니까!

튜플

 

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

bool comp(pair<int, int> a, pair<int, int> b){
    return a.second > b.second;
}

vector<int> solution(string s) {
    vector<int> answer;
    vector<pair<int, int>> arr(100001, {0, 0});

    for(int i = 0; i < 100001; i++){
      arr[i].first = i;
    }
    
    string temp = "";
    for(int i = 0; i < s.size(); i++){
        if(s[i] == '}' || s[i] == '{' || s[i] == ',' ){
            if(temp != ""){
                arr[stoi(temp)].second++;
            }
            temp = "";
        }else{
            temp += s[i];
        } 
        
    }
    
    sort(arr.begin(), arr.end(), comp);

    for(int i = 0; i < arr.size(); i++){
        if(arr[i].second == 0)
            break;
        answer.push_back(arr[i].first);
    }
    
    return answer;
}

이문제는 문제가 이해가 안되서 고생했다. 

어찌됬든 각원소가 등장한 횟수를 체크해서 내림차순으로 배열에 넣어주면 정답이 된다. 

문자열을 자를때는 } , { 는 무시하고 숫자만 누적해서 숫자를 구해준다(stoi 함수를 통해 string으로 int 로 변환)

 

 

다음큰숫자

뭔가 이상한거 같다. 인터넷에 있는 답변도 다 안됨

시간초과 날게 없는데도 시간초과가 계속난다. 근데 숫자범위가 적어서 이해가 안된다. 진짜 브루트포스적으로 풀어도 풀려야하는데.

 

땅따먹기

#include <iostream>
#include <vector>
using namespace std;

int comp(int a, int b, int c){
    int answer = a;
    if(answer < b)
        answer = b;
    if(answer < c)
        answer = c;
    return answer;
}

int solution(vector<vector<int> > land)
{
    int answer = 0;
    vector<vector<int>> d(land.size(), vector<int> (4, 0));
    
    d[0][0] = land[0][0];
    d[0][1] = land[0][1];
    d[0][2] = land[0][2];
    d[0][3] = land[0][3];
    
    for(int i = 1; i < land.size(); i++){
        d[i][0] = comp(d[i-1][1], d[i-1][2], d[i-1][3]) + land[i][0];
        d[i][1] = comp(d[i-1][0], d[i-1][2], d[i-1][3]) + land[i][1];
        d[i][2] = comp(d[i-1][0], d[i-1][1], d[i-1][3]) + land[i][2];
        d[i][3] = comp(d[i-1][0], d[i-1][1], d[i-1][2]) + land[i][3];
    }
    
    answer = d[land.size()-1][0];
    if(answer < d[land.size()-1][1])
        answer = d[land.size()-1][1];
    if(answer < d[land.size()-1][2])
        answer = d[land.size()-1][2];
    if(answer < d[land.size()-1][3])
        answer = d[land.size()-1][3];
    return answer;
}

전형적인 다이나믹 프로그래밍 문제. 다이나믹 프로그래밍 문제의 경우에는 쉬워도 헤멜때가 많은데, 오늘은 잘 풀어서 기분이 좋다.

이렇게 문제를 잘풀면 기부니 조크든요.

 

 

포켓몬

 

 

#include <vector>
using namespace std;

int solution(vector<int> nums)
{
    int answer = 0;
    vector<int> a(200001, 0);
    
    for(int i = 0; i < nums.size(); i++){
        a[nums[i]]++;
    }
    
    int n = nums.size() / 2;
    int c = 0; 
    for(int i = 0; i < 200001; i++){
        if(a[i] > 0){
            c++;
        }
    }
    
    if(n <= c)
        answer = n;
    else
        answer = c;
    
    return answer;
}

 

이문제는 뭐... 레벨2는 이상한게 어려운건 진짜 레벨2가 맞나 싶다가, 쉬운건 또 엄청 쉽다. 최대 n개를 가져갈수 있고, 종류 수(c)가 n보다 작아도 가져갈 수 있는 종류는 c, n보다 커도 n개 밖에 못가져간다.

 

후기

이번주는 화요일에 문제를 다 풀었다. 쉬운 문제들이라 가능했지만, 당분간은 보안 공부를 더 열심히 하려고 하루정도 몰아서 알고리즘을 하고 나머지날에는 다른 공부를 하려고 한다. 

알고리즘 공부가 좋은건 확실히 코드를 생각할때 좀 더 분명해지는것이 있다는거다. 많은 개발자분들이 단순히 뭔가 구현만 되면 끝이라고 생각하기도 하는것같은데, 사실 그냥 아무렇게 만드는건 아무나 하지만 잘하는게 어려운것 아니겠나. 잘하기 위해서는 알고리즘이 꼭 필요하다고 생각한다. 이런 능력을 키워야 자잘한 버그도 잡아낼수 있을 것이다.