old/Algorithm

13주차. 알고리즘 3문제 풀기

hYhY1234 2020. 9. 5. 23:17
728x90

13주차를 시작하며

이상하게 꼭 세문제를 풀겠다고하면 그냥 임의로 3문제 뽑는건데도 꼭 세번째 문제는 잘 안풀린다. 알 수 없다. 3월부터 계속 알고리즘 공부를 하는 내가 자랑스럽다. 무슨 알고리즘 기본만 해도 된다는데, 난 그만큼만 공부하면 안되던데 어떤 사람은 되나보다. 재수없는 사람들이 세상에 참많은가보다. 여튼 나는 내 할일을 해야하는데, 꿋꿋이 세문제나 그보다 더 많이 풀어온 내자신이 자랑스럽다. 

 

추석 트래픽(쫄면 못풀지만, 안쫄면 풀수있다)

programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ 2016-09-15 20:59:57.421 0.351s, 2016-09-15 20:59:58.233 1.181s, 2016-09-15 20:59:58.299 0.8s, 2016-09-15 20:59:58.688 1.041s, 2016-09-15 20:59:59.591 1.412s, 2016-09-15 21:00:00.464 1.466s, 2016-09-15 21:00:00.741 1.581s, 2016-09-15 21:00:00.748

programmers.co.kr

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

pair<int, int> converter(string lines){
    string end = lines.substr(11, 12);
    string duration = lines.substr(24);
    
    int endnum = stoi(end.substr(0,2)) * 60 * 60 * 1000;
    endnum += stoi(end.substr(3,2)) * 60 * 1000;
    endnum += stoi(end.substr(6,2)) * 1000;
    endnum += stoi(end.substr(9));

    int startnum = stoi(duration.substr(0, 1)) * 1000 - 1;
    if(duration[1] == '.'){
        int c = 0; 
        for(int i = 2; i < duration.size(); i++){
            if(duration[i] == 's'){
                break;
            }
            c++;
        }
        startnum += stoi(duration.substr(2, c));
    }
    
    pair<int, int> a;
    a.first = endnum - startnum;
    a.second = endnum;
    return a;
}

int solution(vector<string> lines) {
    int answer = 0;
    
    int mmin = 100000000;
    int mmax = -1000000000;
    vector<pair<int, int>> con;
    for(int i = 0; i < lines.size(); i++){
        pair<int, int> a = converter(lines[i]);
        con.push_back(a);
        if(mmin > a.first){
            mmin = a.first;
        }
        if(mmax < a.second){
            mmax = a.second;
        }
    }
     
    for(int i = 0; i < con.size(); i++){
        con[i].first = con[i].first - mmin;
        con[i].second = con[i].second - mmin;
    }
    
    // 0초부터 1초깢, 0.001초에서 1.001초까지
    vector<int> checker(mmax - mmin + 1001, 0);
    
    for(int i = 0; i < con.size(); i++){
        int start = con[i].first;
        int end = con[i].second + 999;
        for(int j = start; j <= end; j++){
            checker[j]++;
        }
    }
    
    for(int i = 0; i < checker.size(); i++){
        if(answer < checker[i]){
            answer = checker[i];
        }
    }
    return answer;
}

프로그래머스에서 3단계 문제를 풀다보면, 어떤 문제는 정말로 어려운 문제라 3단계이고 어떤건 겁을 줘서 못푸는거지만 사실은 그렇게 어려운문제가 아닌 경우가 있다. 이 경우가 딱 후자의 경우이다. 내가 숫자가 좀 약하다보니까(진짜 약한지는 모르겠다, 대학은 수리논술 100프로에 논술은 항상 잘해서.. 그냥 수능 수학을 잘 못한거같기두하고..) 이런 숫자 다루는 문제는 좀 쫄아서 잘 못푼다. 

 

하지만 이 문제는 단순히 for문을 여러개 잘 쓰면 풀수 있는 문제이다(더 효율적으로 푸는 방법도 있겠지만!!)

 

1. 일단 시간은 숫자로 변환해서 인덱스로 쓸수 있게만든다 ->  이부분이 좀 아리까리했다. 좀 노가다스럽기도하고. 

모든 숫자는 ms 를 1인 것으로 변환한다. 

 

 

2. 끝시간과 처리 시간을 숫자화 한다음 시작시간을 구하는데, 이때 시작시간 = 끝시간 - 처리시간 + 1 이다. 왜냐하면 양끝시간은 포함한다고 했기 때문에. 

 

3. 그다음 그냥 배열을 만들어도 되지만, 나는 최소값을 구해서 제일 작은 시작시간을 0으로 한번 변환해줬다(내 정신건강을 위해서)

 

4. 그다음 checker라는 벡터를 생성했다. 이건 각 구간을 표시하려고 하는거다. 해당하는 부분에 1을 더해줘서 최종에 제일많이 겹치는 부분을 구하려고 한다. 

 

그런데 이때 end는 999ms를 더해준다. 왜냐하면 1초동안이라고 했는데, 나는 다 ms로 구해놨기때문에, 

만약 end가 0001 ms면, 0001ms 부터 0005 ms 랑은 1초 내에있는건데, end를 0001로 끝내버려미녀 0002ms에서부터 확인하면 구간이 겹치지 않아서 갯수가 빠지기 때문이다. 

 

 

 

설명을 잘 써보려고하는데, 아직 설명능력은 조금 부족한것 같다!!! 

 

 

2Xn타일링

programmers.co.kr/learn/courses/30/lessons/12900

 

코딩테스트 연습 - 2 x n 타일링

가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 ��

programmers.co.kr

 

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

int solution(int n) {
    int answer = 0;
    int ddiv = 1000000007;
    
    vector<int> d(n+1, 0);
    d[1] = 1;
    d[2] = 2;
    for(int i = 3; i <= n; i++){       
        d[i] = (d[i-2] + d[i-1])%ddiv;
    }
    answer = d[n] % ddiv;
    return answer;
}

 

거의 뭐 다이나믹 프로그래밍의 교과서적인 문제다. 

 

 

브라이언의 고민

programmers.co.kr/learn/courses/30/lessons/1830

 

코딩테스트 연습 - 브라이언의 고민

브라이언의 고민 알림: '실행'을 눌렀을 시 올바른 코드가 틀린 결과로 표시되는 경우가 있습니다. 하단의 설명을 참고해주세요. 카카오스토리의 개발자 브라이언에게 최근 고민이 생겼다. 하루

programmers.co.kr