μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€_1339_λ‹¨μ–΄μˆ˜ν•™

shj718 2022. 5. 10. 07:39

πŸ“λ¬Έμ œ: https://www.acmicpc.net/problem/1339

 

1339번: 단어 μˆ˜ν•™

첫째 쀄에 λ‹¨μ–΄μ˜ 개수 N(1 ≤ N ≤ 10)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 단어가 ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀. λ‹¨μ–΄λŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ μ΄λ£¨μ–΄μ Έμžˆλ‹€. λͺ¨λ“  단어에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ•ŒνŒŒλ²³μ€ μ΅œλŒ€

www.acmicpc.net

 

πŸ“μ•Œκ³ λ¦¬μ¦˜: 브루트포슀 - μˆœμ—΄ (Greedy λ˜λŠ” 브루트포슀-μž¬κ·€λ‘œλ„ ν’€ 수 있음)

 

πŸ“μ•„μ΄λ””μ–΄: ASCII μ½”λ“œλ₯Ό μ΄μš©ν•΄μ„œ charν˜• 배열을 λ‹€λ₯Έ λ°°μ—΄μ˜ index둜 μ‚¬μš©ν•΄μ„œ μ•ŒνŒŒλ²³μ„ 숫자둜 μΉ˜ν™˜.

 

πŸ”­ 벑터 쀑볡 제거 방법:

λ°˜λ“œμ‹œ sort ν•œ 후에 unique ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ 제거.

// alphabets 벑터 쀑볡 제거
sort(alphabets.begin(), alphabets.end());
alphabets.erase(unique(alphabets.begin(), alphabets.end()), alphabets.end());

 

πŸ“μ½”λ“œ:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int N; // 단어 개수
char alpha[128]; // ν•΄λ‹Ή 인덱슀의 μ•ŒνŒŒλ²³μ΄ μ–΄λ–€ 숫자둜 λ°”λ€ŒλŠ”μ§€ μ €μž₯ (μΈλ±μŠ€λŠ” ASCII μ½”λ“œ)

int calc(vector<string>& wordArr, vector<char>& alphabets, vector<int>& numbers) {
	int s = alphabets.size();
	int sum = 0;
	for (int i = 0; i < s; i++) {
		alpha[alphabets[i]] = numbers[i]; // μ•ŒνŒŒλ²³μ„ 숫자둜 μΉ˜ν™˜
	}

	for (string word : wordArr) {
		int now = 0;
		for (char x : word) {
			now = now * 10 + alpha[x];
		}
		sum += now;
	}
	return sum;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> N;
	vector<string> wordArr(N);
	vector<char> alphabets; // 단어에 μ–΄λ–€ μ•ŒνŒŒλ²³λ“€μ΄ μžˆλŠ”μ§€
	for (int i = 0; i < N; i++) {
		cin >> wordArr[i];
		for (char letter : wordArr[i]) {
			alphabets.push_back(letter);
		}
	}

	// alphabets 벑터 쀑볡 제거
	sort(alphabets.begin(), alphabets.end());
	alphabets.erase(unique(alphabets.begin(), alphabets.end()), alphabets.end());
	int s = alphabets.size();
	vector<int> numbers;
	for (int i = 9; i > 9 - s; i--) { // μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” λ¬Έμ œλ‹ˆκΉŒ 9λΆ€ν„° μ•ŒνŒŒλ²³ 개수만큼 숫자 κ³ λ₯΄κΈ°
		numbers.push_back(i);
	}

	// μˆœμ—΄ μ΅œλŒ€κ°’ κ΅¬ν•˜κΈ°
	int ans = 0;
	do {
		int tmp = calc(wordArr, alphabets, numbers);
		if (ans < tmp) {
			ans = tmp;
		}
	} while (prev_permutation(numbers.begin(), numbers.end()));

	cout << ans << '\n';
	return 0;
}