알고리즘/백준

[백준][C++] 1339: 단어 수학

KANTAM 2024. 2. 4. 23:51

문제

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net

풀이

그리디

 

가장 큰 자리수로 많이 입력된 알파벳이 9가 되어야 하고, 다음으로 적게 입력된 알파벳이 8이 되어야 한다. 이런 순서로 알파벳을 숫자로 변환한다. 

 

GCF가 입력되면 알파벳이 하나의 숫자라고 생각하면,

GCF = G * 100 + C * 10 + F로 표현할 수 있다. 

ACDEB가 입력되면

ACDEB = A * 10000 + C * 1000 + D * 100 + E * 10 + B로 표현할 수 있다. 여기서 각 알파벳의 계수를 보면 다음과 같다. 

A 10000
C 1010
G 100
D 100
E 10
B 1

위의 결과에서 A부터 9, B를 1로 설정하면 합은 99437이 된다. 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int alphabet[26];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

    int N;
    cin >> N;

    for (int i = 0; i < N; ++i)
    {
        string s;
        cin >> s;
        reverse(s.begin(), s.end());

        // 알파벳 별로 어느 자리수로 입력되었는지 확인
        for (int j = s.length() - 1; j >= 0; --j)
        {
            long long temp = pow(10, j);
            alphabet[s[j] - 'A'] += temp;
        }
    }

    // 내림차순 정렬
    sort(alphabet, alphabet + 26, greater<>());

    int answer = 0;
    int current = 9;
    for (int i = 0; i < 26; ++i)
    {
        if (alphabet[i] == 0)
        {
            continue;
        }
        answer += alphabet[i] * current;
        current--;
    }

    cout << answer;

    return 0;
}