• toc {:toc}

문제 ν™•μΈν•˜κΈ°

풀이

κ°€μž₯ μ΅œλŒ“κ°’μ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œ 각 μ•ŒνŒŒλ²³λ§ˆλ‹€ μ–΄λ–»κ²Œ 1~9 μ‚¬μ΄μ˜ 숫자λ₯Ό 배정해쀄 것인가에 λŒ€ν•œ λ¬Έμ œμ΄λ‹€. μ΅œλŒ“κ°’μ„ λ§Œλ“œλŠ”λ° κ°€μž₯ 쀑점적인 뢀뢄은 μžλ¦Ώμˆ˜μ΄λ―€λ‘œ ν•΄λ‹Ή 뢀뢄을 μ€‘μ μ μœΌλ‘œ μƒκ°ν•œλ‹€.

  • 아이디어1
    • 자릿수(size)λ§ˆλ‹€ κ°€μ€‘μΉ˜λ₯Ό λ‘¬μ•Όν•œλ‹€κ³  μƒκ°ν–ˆλ‹€.
    • 자릿수 제곱으둜 μ•ŒνŒŒλ²³λ§ˆλ‹€ κ°€μ€‘μΉ˜λ₯Ό μ£Όκ³  높은 μ•ŒνŒŒλ²³λΆ€ν„° 숫자 9μ—μ„œ 1κΉŒμ§€ 순차적으둜 λΆ€μ—¬ν–ˆλ‹€.
    • 문제 : κ°€μ€‘μΉ˜ 적용이 μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ λ°˜λ‘€κ°€ μ‘΄μž¬ν•œλ‹€.
      • ex) 10, ABB, BC, BC, BC, BC, BC, BC, BC, BC, BC
      • A의 κ°€μ€‘μΉ˜ : 9, B의 κ°€μ€‘μΉ˜ : 41, C의 κ°€μ€‘μΉ˜ : 9
      • μ΅œλŒ€κ°€ μ•„λ‹Œ 값이 λ‚˜μ˜¨λ‹€.
#include <bits/stdc++.h>
using namespace std;
 
char alpha_num[30];
pair<char, int> alpha_scores[30];
 
bool compare(const pair<char, int>& a, const pair<char, int>& b){
    return a.second > b.second;
}
 
int main(){
    ios:: sync_with_stdio(false);
    cin.tie(0);
 
    vector<string> words;
 
    int N, res = 0;
    char num = '9';
    string str, temp;
 
    cin >> N;
 
    for(int i = 0; i < N; i++){
        cin >> str;
        int size = str.size()-1;
        words.push_back(str);
        for(int j = 0; j < str.size(); j++){
            alpha_scores[str[j]-'A'].first = str[j];
            alpha_scores[str[j]-'A'].second += (size+1)*(size+1);
            size--;
        }
    }
    sort(alpha_scores, alpha_scores+26, compare);
 
 
    for(int i = 0; i < 27; i++){
        if(alpha_scores[i].second == 0) continue;
        alpha_num[alpha_scores[i].first-'A'] = num--;
    }
 
    for(int i = 0; i < words.size(); i++){
        temp = "";
        for(int j = 0; j < words[i].size(); j++){
            temp += alpha_num[words[i][j]-'A'];
        }
        res += stoi(temp);
    }
 
 
    cout << res << '\n';
 
    return 0;
}

아이디어 1의 κ°€μ€‘μΉ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 백의 μžλ¦¬μ™€ 일의 μžλ¦¬κ°€ μ„œλ‘œ κ°™κ²Œ λ˜κΈ°μ— κ°€μ€‘μΉ˜ 역할을 μˆ˜ν–‰ν•˜μ§€ λͺ»ν•œλ‹€. μžλ¦Ώμˆ˜λ³„λ‘œ κ°€μ€‘μΉ˜μ˜ 차이λ₯Ό ν™•μ‹€ν•˜κ²Œ 둬야 ν•œλ‹€.

  • 아이디어 2
    • μƒκ°ν•΄λ³΄λ‹ˆ κ°€μ€‘μΉ˜λ₯Ό 제곱 ν˜•νƒœλ‘œ 쀄 ν•„μš”κ°€ μ—†λ‹€. κ·Έλƒ₯ μžλ¦Ώμˆ˜λŒ€λ‘œ κ°€μ€‘μΉ˜λ₯Ό μ£Όλ©΄ λœλ‹€.
    • ex) 10, ABB, BC, BC, BC, BC, BC, BC, BC, BC, BC
      • 백의 μžλ¦¬λŠ” 100, μ‹­μ˜ μžλ¦¬λŠ” 10, 일의 μžλ¦¬λŠ” 1둜 κ°€μ€‘μΉ˜λ₯Ό μ μš©ν•œλ‹€.
      • 100A, 101B, 9C
#include <bits/stdc++.h>
using namespace std;
 
pair<char, int> alpha_scores[30];
 
bool compare(const pair<char, int>& a, const pair<char, int>& b){
    return a.second > b.second;
}
 
int main(){
    ios:: sync_with_stdio(false);
    cin.tie(0);
 
    vector<string> words;
 
    int N, res = 0;
    int num = 9;
    string str, temp;
 
    cin >> N;
 
    for(int i = 0; i < N; i++){
        cin >> str;
        int size = str.size()-1;
        words.push_back(str);
        for(int j = 0; j < str.size(); j++){
            alpha_scores[str[j]-'A'].first = str[j];
            alpha_scores[str[j]-'A'].second += pow(10, size--);
        }
    }
    sort(alpha_scores, alpha_scores+26, compare);
 
    for (int i = 0; i < 27; i++){
        if(alpha_scores[i].second == 0) continue;
        res += alpha_scores[i].second * num--;
    }
 
    cout << res << '\n';
 
    return 0;
}