2025.01.13 (월요일)

14916번 “거스름돈” (실버V)

image.png

거스름돈이 주어지면 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을 출력한다.

2025.01.14 (화요일)

23253번 “자료구조는 정말 최고야” (실버V)

image.png

image.png

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를 출력한다.

2025.01.15 (수요일)

1302번 “베스트셀러” (실버IV)

image.png

책의 제목들을 입력으로 받았을 때 가장 많이 나온 제목을 출력하는 문제이다.

#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값이 가장 큰 책의 제목을 출력한다.

2025.01.16 (목요일)