-
백준 - 단어 수학 (1339) [C++]문제 풀이/백준 2024. 1. 18. 14:17반응형
이 문제는 그리디 알고리즘으로 풀었다.
완전 탐색으로 가능해 보이지만, 직접 코드를 작성해보니 시간 초과가 났다.
각 단어에서 알파벳을 검사하고, 해당 위치에 대해 가중치를 10^n 단위로 매겼다. 이를 각 알파벳에 더해주고, 해당 가중치로 내림차순 정렬하여 순서대로 9부터 숫자를 매겼다. 이 방법으로 정답을 맞출 수 있었다.
#include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> #include <utility> using namespace std; #define MAX 10 #define ALPHA 26 int N; string words[MAX]; map<char, int> cost; map<char, char> mappedNum; int calcPower(int power) { if (power == 0) { return 1; } return 10 * calcPower(power - 1); } bool compare(pair<char, int> &a, pair<char, int> &b) { return a.second > b.second; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N; for (int i = 0; i < N; i++) { cin >> words[i]; } for (int i = 0; i < N; i++) { string& word = words[i]; int wordSize = word.size(); for (int j = 0; j < wordSize; j++) { char c = word[j]; int power = wordSize - j - 1; int presentCost = calcPower(power); cost[c] += presentCost; } } vector<pair<char, int>> alpha; for (auto iter = cost.begin(); iter != cost.end(); iter++) { char key = iter->first; int tempCost = iter->second; alpha.push_back({ key, tempCost }); } sort(alpha.begin(), alpha.end(), compare); char num = '9'; for (int i = 0; i < alpha.size(); i++) { char c = alpha[i].first; char num = (char)((9 - i) + '0'); mappedNum[c] = num; } int answer = 0; for (int i = 0; i < N; i++) { string &word = words[i]; string temp = ""; for (char c : word) { temp += mappedNum[c]; } answer += stoi(temp); } cout << answer << '\n'; return 0; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 보석 도둑 (1202) [C++] (0) 2024.01.21 백준 - 최소 스패닝 트리 (1197) [C++] (0) 2024.01.18 백준 - 카드 정렬하기 (1715) [C++] (0) 2024.01.18 백준 - 꼬인 전깃줄 (1365) [C++] (0) 2024.01.17 백준 - 사냥꾼 (8983) [C++] (0) 2024.01.17