vector
로 저장vector
에 존재하는지 확인 후, 존재하면 현재 단어에서의 자리수와 이미 저장된 자리수를 비교해서 큰 값을 넣음vector
를 자리수를 기준으로 내림차순 정렬vector
에 저장했다가 map
에 저장했다가 하면서 자료형을 너무 많이 사용하고 탐색도 빈번하게 사용하게 되어서 비효율적
애초에 방법이 잘못 된 것 같음
⭐️ 그리디 알고리즘
자릿수가 클수록 높은 수를 배정해야 최종적으로 큰 값을 산출할 수 있기 때문에 알파벳의 자릿수를 저장한 이후 최종적으로 높은 값을 가진 알파벳 순으로 값을 곱해주는 방식으로 풀이
ex) GCF 에서 G는 100의 자리, C는 10의 자리, F는 1의 자리이고 ACDEB 에서 A 는 10000의 자리, C는 1000의 자리, D는 100의 자리, E는 10의 자리, B는 1의 자리이므로
➡️ A = 10000, C = 1000+100, D = 100, G = 100, E = 10, F= 1, B = 1
이렇게 저장한 이후, 값이 가장 큰 A 부터 9를 곱해주고 C는 8, D는 7을 곱해주는 방식으로 하면 최종적인 최대값을 구할 수 있음
어차피 같은 자리수에 대해서는 서로 바뀌어도 동일하기 때문에 같은 값에 대한 예외처리를 따로 해줄 필요는 없음
풀이가 너무 복잡해지고 배열들을 너무 더럽게 사용해야 한다면 다른 방법 고안해볼 필요가 있음
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
int alpha[26]={0,};
while(n--) {
string s;
cin >> s;
int k=s.size()-1;
for(int i=0;i<s.size();i++) {
int c=s[i]-'A';
alpha[c]+=pow(10,k);
k--;
}
}
sort(alpha, alpha+26, greater<int>());
int k=9;
int ans=0;
for (int i=0; i<26; i++) {
if (alpha[i]!=0) {
ans+=alpha[i]*k;
k--;
}
}
cout << ans << endl;
}