[BOJ] 1339 : 단어 수학
풀이
그리디
원래는 백트래킹으로 순열을 써서 풀었다. 그런데 예제케이스의 10 ABCDEFGHI 이부분이
제출했을때는 500ms로 통과되는데, 로컬에서는 10초정도가 걸린다. 찝찝하다.
질문게시판에 보니까 그리디로도 풀린다고 한다. 그래서 곰곰이 생각해보니까
각 알파벳의 위치에 따라 가중치를 더한다음 큰순서대로 9,8,7…값을 할당받아서
곱한값을 출력하면 되는것이다.
계산을 편하게 하기위해 입력 string을 reverse한 뒤
해당 알파벳의 위치에 따라 가중치를 곱해서 vector에 넣어준다.
그후에 큰숫자가 앞으로오게 sort하고, 큰순서대로 9,8,7,6,5,4,3,2,1,0 값을 곱해주면 끝.
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <functional>
using namespace std;
vector<int> v(26);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string tmp;
cin >> tmp;
reverse(tmp.begin(), tmp.end());
int ten = 1;
for (int i = 0; i < tmp.size(); i++) {
v[tmp[i] - 'A'] += ten;
ten *= 10;
}
}
sort(v.begin(), v.end(), greater<int>());
int ans = 0;
int num = 9;
for (auto x: v) {
ans += x*num;
num--;
}
cout << ans;
return 0;
}
Written on April 7, 2019