728x90
다리를 지나는 트럭
https://school.programmers.co.kr/learn/courses/30/lessons/42583
풀다가 맞지 않아서 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
문제 이해를 잘못해서 못풀었다... ㅠㅠㅠ 증가하는 구간이라고 했으므로 감소시에는 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
이것도 잘 모르겠어서 풀이를 보고 풀었다.. ㅠ 점수가 점점 깎이고있다 ..으어어
코드
#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
코드
#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
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 문제 모음 (0) | 2023.03.21 |
---|---|
프로그래머스 문제풀이 모음 (0) | 2023.03.20 |
프로그래머스 문제 풀이 모음 (0) | 2023.03.19 |
프로그래머스: 입국 심사 (2) | 2023.03.18 |
프로그래머스: 구명 보트 (0) | 2023.03.18 |