거스름돈이 주어지면 2원과 5원의 동전을 활용하여 줄 수 있는 최소의 동전의 개수를 구하는 문제이다.
#include <iostream> //c++
#include <stdio.h> //c
#include <vector> //c++ 배열
#include <algorithm> // 탐색, 정렬 등 알고리즘
#include <utility> //
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#define fio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // input, output 빠르게 하는 거
#define ll long long // long long이 너무 기니까 ll로 줄여요
#define pii pair<int,int> // pair<int,int>가 너무 길어요 그래서 pii로 줄여요
#define pll pair<ll,ll> // pair<long long, long long> 이 너어어어무 길어요. 그래서 pll로 줄여요
#define MOD 1e9+7 // 모듈러 계산할 때 쓰이는 값, 근데 문제마다 바뀌니까 알아서 바꾸세요
using namespace std;
int main()
{
fio;
int n;
cin>>n;
int a=-1,b=-1;
for(int i=0;n-2*i>=0;i++)
{
if((n-2*i)%5==0 || (n-2*i)==0)
{
a=i;
b=(n-2*i)/5;
break;
}
}
if(a==-1 && b==-1)
{
cout<<"-1";
return 0;
}
cout<<a+b;
}
2원 동전의 개수를 0개부터 늘려가면서 2원들을 뺀 나머지가 5원으로 나누어 떨어지거나 늘려가다가 2원들을 뺀 나머지가 0이 되었을 때 그 때의 2원의 개수와 5원의 개수가 최소이다. 5원의 개수가 최대 인 경우가 동전의 개수가 최소인 경우이기 때문이다. 2원의 개수와 5원의 개수를 더하여 출력한다. 만약 두 경우다 해당되지 않으면 거스름돈을 2원과 5원으로 표현할 수 없음을 나타내므로 -1을 출력한다.
1부터 N까지의 책이 M개의 더미로 나누어져 쌓여있을 때 맨 위의 책들만을 빼서 1부터 N까지 정렬할 수 있는지 여부를 묻는 문제이다.
#include <iostream> //c++
#include <stdio.h> //c
#include <vector> //c++ 배열
#include <algorithm> // 탐색, 정렬 등 알고리즘
#include <utility> //
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#define fio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // input, output 빠르게 하는 거
#define ll long long // long long이 너무 기니까 ll로 줄여요
#define pii pair<int,int> // pair<int,int>가 너무 길어요 그래서 pii로 줄여요
#define pll pair<ll,ll> // pair<long long, long long> 이 너어어어무 길어요. 그래서 pll로 줄여요
#define MOD 1e9+7 // 모듈러 계산할 때 쓰이는 값, 근데 문제마다 바뀌니까 알아서 바꾸세요
using namespace std;
int arr[200005];
//누적된 스택의 top들
int brr[200005];
//top값의 스택 인덱스
int main()
{
fio;
int n,m;
cin>>n>>m;
vector <stack <int>> v(n);
int p,q;
for(int i=0;i<m;i++)
{
cin>>p;
for(int j=0;j<p;j++)
{
cin>>q;
v[i].push(q);
}
arr[v[i].top()]++;
brr[v[i].top()]=i;
}
for(int i=1;i<=n;i++)
{
if(arr[i]==1)
{
v[brr[i]].pop();
if(v[brr[i]].empty()==0)
{
arr[v[brr[i]].top()]++;
brr[v[brr[i]].top()]=brr[i];
}
}
else
{
cout<<"No";
return 0;
}
}
cout<<"Yes";
}
책들의 더미를 스택 벡터를 활용해 저장한다. 현재 맨 위에 올라온 책들을 저장하고 각 맨위의 책들이 몇번째 더미 위에 있는 건지를 배열을 활용해 저장한다. 책1 부터 순서대로 제거하면서 제거할 때마다 맨위 책 배열을 업데이트 해주면서 순서대로 모든 책을 제거가 가능하면 Yes, 그렇지 않으면 No를 출력한다.
책의 제목들을 입력으로 받았을 때 가장 많이 나온 제목을 출력하는 문제이다.
#include <iostream> //c++
#include <stdio.h> //c
#include <vector> //c++ 배열
#include <algorithm> // 탐색, 정렬 등 알고리즘
#include <utility> //
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#define fio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // input, output 빠르게 하는 거
#define ll long long // long long이 너무 기니까 ll로 줄여요
#define pii pair<int,int> // pair<int,int>가 너무 길어요 그래서 pii로 줄여요
#define pll pair<ll,ll> // pair<long long, long long> 이 너어어어무 길어요. 그래서 pll로 줄여요
#define MOD 1e9+7 // 모듈러 계산할 때 쓰이는 값, 근데 문제마다 바뀌니까 알아서 바꾸세요
using namespace std;
int main()
{
fio;
string str;
vector <pair<string,int>> v;
int n;
cin>>n;
int con=0;
for(int i=0;i<n;i++)
{
con=0;
cin>>str;
for(int j=0;j<v.size();j++)
{
if(v[j].first==str)
{
v[j].second++;
con=1;
break;
}
}
if(con==0)
{
v.push_back({str,1});
}
}
int max=-1;
int maxindex;
for(int i=0;i<v.size();i++)
{
if(v[i].second>max)
{
max=v[i].second;
maxindex=i;
}
if(v[i].second==max)
{
if(v[i].first<v[maxindex].first)
{
maxindex=i;
}
}
}
cout<<v[maxindex].first;
}
vector <pair<string,int>> 을 생성한다. first는 책의 제목이고 second는 책의 권 수 이다. 반복문을 통해 처음 나오면 책의 제목과 권 수와 함께 벡터에 push back하고 이미 나온 책이면 그 책의 권 수에 1을 추가 해준다. 벡터의 second값이 가장 큰 책의 제목을 출력한다.