알고리즘/알고리즘 문제풀이

프로그래머스 문제풀이 모음

mint* 2023. 3. 20. 00:30
728x90

다리를 지나는 트럭

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀다가 맞지 않아서 https://surprisecomputer.tistory.com/65?category=931283 이 분 풀이를 봤다.

 

흐름

다리의 길이만큼 사이즈를 두고, 트럭과 0(빈 곳)을 차례대로 채워넣는다.

 

코드

#include <bits/stdc++.h>

using namespace std;
queue<int> q;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
    int pos=0; 
    int tsize=truck_weights.size(); //트럭 개수
    int sum=0; //합
    while(pos<tsize){ //트럭이 다 지날때까지
        if(q.size()>=bridge_length){ //다리에 트럭이 다 차면
            sum -= q.front(); q.pop();
        }
        if(sum+truck_weights[pos]<=weight){ //다리에 트럭 더 들어올 수 있으면
            q.push(truck_weights[pos]); 
            sum += truck_weights[pos++];
        }
        else q.push(0); //못 들어오면 0으로 채우기
        answer++; //시간 1초씩 흐름
    }
    answer += bridge_length; //마지막 트럭 이동 시간 더하기
    return answer;
}

 

주식 가격

https://school.programmers.co.kr/learn/courses/30/lessons/42584#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 이해를 잘못해서 못풀었다... ㅠㅠㅠ 증가하는 구간이라고 했으므로 감소시에는 break 해야한다.

풀이를 보고 풀었다.

흐름

마지막 감소하는 부분은 포함한다.

 

코드

#include <bits/stdc++.h>

using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer;
    for(int i=0;i<prices.size();i++){
        int cnt=0;
        for(int j=i+1;j<prices.size();j++){ //앞 부분에서
            if(prices[i] <=prices[j]) cnt++; //가격 떨어지지 않으면 유지
            else{ //가격 떨어지면 cnt++(그 구간까지는 포함)하고 break
                cnt++; break;
            }
        }
        answer.push_back(cnt); //저장하기
    }
    return answer;
}

 

순위

https://school.programmers.co.kr/learn/courses/30/lessons/49191

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

이것도 잘 모르겠어서 풀이를 보고 풀었다.. ㅠ 점수가 점점 깎이고있다 ..으어어

 

코드

#include <bits/stdc++.h>

using namespace std;
bool arr[104][104];

int solution(int n, vector<vector<int>> results) {
    int answer = 0;
    for(int i=0;i<results.size();i++){
        int a=results[i][0]; //이긴 사람
        int b=results[i][1]; //진 사람
        arr[a][b]=true;
    }
    //승부 순위 파악하기
    for(int k=1;k<=n;k++){ //중간 노드
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(arr[i][k] && arr[k][j]) arr[i][j]=true;
            }
        }
    }
    //각 노드에 대해 승부 순위 개수 세기
    for(int i=1;i<=n;i++){ //각 노드에 대해
        int cnt=0;
        for(int j=1;j<=n;j++){ //순위 개수 세기
            if(arr[i][j]) cnt++;
            if(arr[j][i]) cnt++;
        }
        if(cnt==n-1) answer++; //순위 개수가 n-1이면 순위 매기기 가능
    }
    
    
    return answer;
}

 

더 맵게

흐름

https://school.programmers.co.kr/learn/courses/30/lessons/42626

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드

#include <bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int>> q; //내림차순

int solution(vector<int> scoville, int K) {
    int answer = 0;
    for(int s:scoville) q.push(s);
    //스코빌 지수 높게 만들기
    int a=0; int b=0; int c=0;
    while(q.size() && q.top()<K){
        if(q.size()>=2){
            a=q.top(); q.pop();
            b=q.top(); q.pop();
            c= a+b*2; 
            q.push(c);
            answer++;
        }
        else { //개수가 1개이면 못만든다.
            answer=-1;
            break;
        }
    }
    
    return answer;
}

 

개인정보 수집 유효기간

https://school.programmers.co.kr/learn/courses/30/lessons/150370#

코드

#include <bits/stdc++.h>

using namespace std;
map<char,int> mp;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    //최소 날짜를 기준으로 날짜로 치환하여 계산 (2000년 1월 1일)
    int year=stoi(today.substr(0,4))-2000;
    int month=stoi(today.substr(5,2))-1;
    int day=stoi(today.substr(8,2))-1;
    int todays=(year*12*28)+month*28+day;
    
    for(string t:terms){ 
        int m=stoi(t.substr(2));
        mp[t[0]]=m; //약관과 날 저장
    }
    
    for(int i=0;i<privacies.size();i++){
        //시작날짜 구하기
        int sy=stoi(privacies[i].substr(0,4));
        int sm=stoi(privacies[i].substr(5,2));
        int sd=stoi(privacies[i].substr(8,2));
        //유효날짜 구하기
        char tem=privacies[i][11];
        sy+=mp[tem]/12; //년도 더하기
        sm+=mp[tem]%12; //달 더하기
        
//         if(sm>12) { //달 오버플로우
//             sy+=sm/12; sm%=12;
//         }
        //날짜로 치환하여 계산
        sy-=2000; sm-=1; sd-=1;
        int sdays=sy*12*28 + sm*28 + sd;
        if(todays>=sdays) answer.push_back(i+1);

    }
    return answer;
}

날짜로 변환하여 푸는 것이 좋다. 최소 날짜 : 2000년 1월 1일을 기준으로 빼어 계산한다.

날,달,월로 계산하는 것은 고려할 것이 많아진다. (24월일때 1년 12월로 바꾸어주어야하는 문제 등)

728x90