본문 바로가기
알고리즘

[BOJ] 백준 1339번: 단어 수학

by 강성주의 알고리즘 2020. 11. 29.

www.acmicpc.net/problem/1339

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net


문제 설명

N개의 알파벳 대문자로만 이루어진 단어가 주어지고, 각 단어의 알파벳을 0~9의 숫자 중 하나의 수로 바꿔서 N개의 수를 합하는 문제입니다.

GCF + ACDEB를 계산한다고 할 때, A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정한다면, 두 수의 합은 99437이 되어서 최대가 된다고 합니다.


문제 풀이

각 알파벳에 1을 대입하여 알파벳 별 합을 구해봅니다.

만약 ABC, BBA 두가지 단어가 주어진다면 A의 합은 100 + 1 로 101이 되고, B의 합은 10 + 110 = 120, C의 합은 1로 볼 수 있습니다.

이 때, 더한 합이 큰 순서대로 9부터 차례대로 수를 대입하면 최대값을 구할 수 있습니다. (탐욕법) 

B = 120 * 9 = 1080, A = 101 * 8 = 808 , C = 7로 A = 8 , B = 9, C = 7 을 대입했을때 897 + 889 = 1786으로 단어의 합의 최댓값을 구할 수 있습니다.


코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <string>
using namespace std;
int cmp(long long a, long long b) {
	return a > b;
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	long long sum[26] = { 0, };
	for (int i = 0; i < n; i++) {
		string str;
		cin >> str;
		int len = str.length();
		long long decimal = 1;
		for (int j = len -1; j > -1; j--) {
			sum[str[j] - 'A'] += decimal;
			decimal *= 10;
		}
	}
	vector<long long> v;
	for (int i = 0; i < 26; i++) {
		if (sum[i]) {
			v.push_back(sum[i]);
		}
	}
	sort(v.begin(), v.end(), cmp);
	long long ans = 0;
	int d = 9;
	for (auto ch : v) {
		ans += (ch * d);
		d--;
	}
	cout << ans;
}
반응형

'알고리즘' 카테고리의 다른 글

[BOJ] 백준 2293번: 동전 1  (0) 2021.03.24
[BOJ] 백준 1517번: 버블소트  (0) 2021.01.11
[BOJ] 백준 2217번:로프  (0) 2020.11.29
[BOJ] 백준 9019번: DSLR  (0) 2020.10.21
[BOJ] 백준 1149번: RGB거리  (0) 2020.10.21