오늘의 문제
단어수학
문제 분석
- N이 1~10 이고, 문자열 길이가 최대8이므로, 2초라는 시간은 넉넉하다.
나의 풀이
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <math.h>
using namespace std;
const int MAX = 10;
vector<string> s(MAX);
int n;
// 단어수학
bool cmp(pair<char, int> a, pair<char, int> b){
return a.second > b.second;
}
int solution(){
map<char, int> m;
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size();j++){
if(m.insert(make_pair(s[i].at(j), pow(10, (s[i].size()-j)-1))).second == false){
m[s[i].at(j)] += pow(10, (s[i].size()-j)-1);
}
}
}
vector<pair<char, int>> v(m.begin(), m.end());
sort(v.begin(), v.end(), cmp);
int answer = 0;
int number = 9;
for(int i=0;i<v.size();i++){
answer += m[v[i].first] * number--;
}
return answer;
}
풀이 방법
- 각 문자가 사용된 자릿수를 합한 결과값에서 제일 큰 합을 가지고있는 알파벳부터 큰 수를 배정해준다.
- map을 정렬하는 방법을 터득했다. vector를 m.begin, m.end로 생성하여, cmp함수를 이용해 정렬한다.
다른 답안
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int n, m, i, len;
int arr[26] = {0};
char str[9];
scanf("%d", &n);
while(n--)
{
scanf("%s", str);
m = 1;
len = strlen(str);
for(i=len-1;i>=0;i--)
{
arr[str[i] - 'A'] += m;
m *= 10;
}
}
sort(arr, arr + 26);
n = 0;
for(i=0;i<9;i++)
{
n += arr[25 - i] * (9 - i);
}
printf("%d\n", n);
return 0;
}
배울 점
- 아 굳이 map을 쓸 필요없이 vector에서 idx로 접근하면 되는거였구나. 를 깨달았다. 나는 한참 멀었다.