2025.1.6 (월요일)

32980번 “분리배출” (실버V)

www.acmicpc.net_problem_32980.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>

#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;
    ll n;
    cin>>n;
    string a[n];
    int b[n];
    ll sum=0;
    int con=0;
    for(ll i=0;i<n;i++)
    {
        con=0;
        cin>>a[i];
        for(ll j=0;j<a[i].size();j++)
        {
            if(a[i][0]!=a[i][j] || a[i][j]=='O')
            {
                con++;
                b[i]=6;
                //cout<<"걸렸다!"<<"\\n";
                break;
            }
        }
        if(con==0)
        {
            //cout<<"안걸렸다..";
            if(a[i][0]=='P')
            {
                //cout<<"P"<<"\\n";
                b[i]=0;
            }
            if(a[i][0]=='C')
            {
                //cout<<"C"<<"\\n";
                b[i]=1;
            }
            if(a[i][0]=='V')
            {
                //cout<<"V"<<"\\n";
                b[i]=2;
            }
            if(a[i][0]=='S')
            {
                //cout<<"S"<<"\\n";
                b[i]=3;
            }
            if(a[i][0]=='G')
            {
                //cout<<"G"<<"\\n";
                b[i]=4;
            }
            if(a[i][0]=='F')
            {
                //cout<<"F"<<"\\n";
                b[i]=5;
            }
        }
    }

    ll recycle[7];
    for(int i=0;i<7;i++)
    {
        cin>>recycle[i];
        //cout<<recycle[i]<<"\\n";
    }
    for(ll i=0;i<n;i++)
    {
        if(recycle[b[i]]>recycle[6])
        {
            sum+=recycle[6]*a[i].size();
            continue;
        }
        sum+=recycle[b[i]]*a[i].size();
    }
    cout<<sum;
}

쓰레기들을 문자열들로 받고 각각의 문자열을 하나하나 탐색하면서 모든 쓰레기의 원소가 같지 않거나 ‘O’ 가 포함되어 있으면 그 쓰레기는 일반 쓰레기의 계산을 하게한후 sum에 더한다. 만약 일반 쓰레기가 아닐 경우 일반 쓰레기로서의 계산값과 해당 원소로서의 계산값을 서로 비교한 뒤 더 작은 값을 sum에 더한다. 마지막에 최종 sum의 값을 출력하는 방법이다.

image.png

2025.1.7(화요일)

1316번 “그룹 단어 체커” (실버V)

www.acmicpc.net_problem_1316.png

문자열을 받고 그 문자열의 같은 문자 사이에 다른 문자가 껴있는 경우가 있는 지 여부를 판단하는 문제이다.

#include <iostream> //c++
#include <stdio.h> //c
#include <vector> //c++ 배열
#include <algorithm> // 탐색, 정렬 등 알고리즘
#include <utility> // 
#include <string>
#include <cmath>
#include <set>
#include <map>

#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()
{
    int a;
    cin>>a;
    int result=0;
    for(int i=0;i<a;i++)
    {
        string x;
        cin>>x;
        int y[124]={0,};
        int con=0;
        for(int j=0;j<x.size();j++)
        {
            int rep=1;
            if(y[x[j]]!=0)
            {
                con++;
            }
            //만약 y 배열을 통해 겹치는 수를 발견할 경우 con에 1추가
            while(rep)
            {
                y[x[j]]++;
                if(x[j]==x[j+1])
                {
                    rep=1;
                    j++;
                }
                else rep=0;
            }
            //연속된 문자가 다 나올때까지 y배열에 저장 
        }
        if(con==0) result++;
        //con이 0이면 result에 값 1 추가
    }
    cout<<result;
}

문자열을 하나하나 탐색하면서 y배열에 연속하여 그 문자가 얼마나 있는지 저장하고 매 순간 문자를 만날 때마다 y배열에 이미 한 번 저장했던 문자인지 여부를 판단하고 만약 그럴 경우 최종 result에 값 1이 추가 되지 않도록 하는 방법이다.

image.png

2025.1.8(수요일)

3273번 “두 수의 합” (실버III)

www.acmicpc.net_problem_3273.png

n개의 숫자를 입력 받아서 n개의 숫자를 이용해 짝을 지었을 때 짝의 합이 x를 만족하는 짝의 개수를 세는 문제이다.