백준 1339 - 단어 수학
접근 및 생각
잘못된 접근
- 처음에 들어온 문자열을 문자로 쪼개서 문자들을 sort해서 next_permutation을 돌렸다. 돌리면서 한 문자에 어떤 숫자가 들어가는 지 결정하고, 또 문자열을 쪼개서 다 합한 것을 계산했다. 뭐라 설명해야할 지 모르겠고, 그냥 미친 짓이였다.
올바른 접근
- 받은 스트링이
ABCDE
가 있다면, 이를10000 * A + 1000 * B + 100 * C + 10 * D + 1 * E
처럼 해석 하는 것이다.- 나는
map<char, int> m
을 선언해서 char에는 문자를, int에는 숫자를 넣어줬다.
- 나는
map
에 다 넣은 뒤,map의 int
기준으로 내림차순 정렬을 하려고 했다. 그래서 새 구조체를 선언했고, map을 vector로 변환하는 과정을 거쳤다.// 구조체 struct Le{ char letter; int value; Le(char a, int b){ letter = a; value = b; } bool operator < (const Le & b) const { return value > b.value; } };
// 벡터로 변환하는 과정 for(auto & i : m){ if(i.second != 0){ exist.push_back(Le(i.first, i.second)); } }
- 내림차순 정렬을 하고, 정렬한 원소 순서대로
9, 8, 7, ...
을 넣어서 계산해주면 된다.int cnt = 9; sort(exist.begin(), exist.end()); for(auto i : exist){ answer += (cnt * i.value); cnt--; }
코드
#include <bits/stdc++.h>
using namespace std;
struct Le{
char letter;
int value;
Le(char a, int b){
letter = a;
value = b;
}
bool operator < (const Le & b) const {
return value > b.value;
}
};
int n, answer;
string temp;
map<char, int> m;
vector<Le> exist;
int main(){
ios_base::sync_with_stdio(false);
cin >> n;
for(int i = 1; i <= n; i++){
cin >> temp;
for(int i = 0; i < temp.length(); i++){
m[temp[i]] += pow(10, temp.length() - i - 1);
}
}
for(auto & i : m){
if(i.second != 0){
exist.push_back(Le(i.first, i.second));
}
}
int cnt = 9;
sort(exist.begin(), exist.end());
for(auto i : exist){
answer += (cnt * i.value);
cnt--;
}
cout << answer;
}
채점 결과
'Coding Test > acmicpc' 카테고리의 다른 글
백준 1074 - Z (c++) (0) | 2020.08.05 |
---|---|
백준 14501 - 퇴사 (c++) (0) | 2020.08.05 |
백준 1748 - 수 이어 쓰기 1 (c++) (0) | 2020.08.03 |
백준 6064 - 카잉 달력 (c++) (0) | 2020.08.03 |
백준 1107 - 리모컨 (c++) (0) | 2020.08.02 |