작심 24/7

[백준] 1339번 단어 수학 본문

백준

[백준] 1339번 단어 수학

모닝수박 2020. 8. 28. 23:07
 

1339번: 단어 수학

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

www.acmicpc.net

수학적으로 풀어도 되지만

백트래킹으로 풀어보았다.

 

계산에 사용되는 M개의 알파벳을 모아놓고

9부터 M개의 숫자를 순열로 대입하였다.

 

ex) ADC -> 3개의 숫자 9, 8, 7을 순열로 배치시키면

알파벳 ADC는

987, 978, 897, 879, 798, 789

이렇게 숫자가 대입될 수 있다.

 

map을 이용해서 각 알파벳에 숫자를 대입해주고

배치가 완료되면 단어의 합을 계산해주고 최댓값을 갱신한다.

 

이때 stoi를 이용하여 계산을 했었는데 시간 초과 나서

그냥 int형으로 계산해주니 통과되었다.

string형 계산이 시간 많이 걸리긴 하나보다.

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int N, Max;
string alphabet, word[11], num;
map <char, int> m;
bool chk[10] = { false };

void Permutation(int cnt) {
	if (cnt == alphabet.size()) {
		int res = 0;
		for (int i = 0; i < N; i++) {
			int tmp = 0;
			for (int j = 0; j < word[i].size(); j++) tmp = tmp*10 + m[word[i][j]];
			res += tmp;
		}
		Max = max(Max, res);
		return;
	}

	for (int i = 9; i >= 10 - (int)alphabet.size(); i--) {
		if (chk[i]) continue;
		chk[i] = true, m[alphabet[cnt]] = i;
		Permutation(cnt + 1);
		chk[i] = false;
	}
	
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> word[i];
		for (int j = 0; j < word[i].size(); j++) {
			if (!m[word[i][j]]) {
				m[word[i][j]] = -1, alphabet += word[i][j];
			}
		}
	}

	Permutation(0);

	cout << Max;
	return 0;
}

'백준' 카테고리의 다른 글

[백준] 11062번 카드 게임  (0) 2020.09.04
[백준] 16890번 창업  (0) 2020.09.01
[백준] 16500번 문자열 판별  (0) 2020.08.27
[백준] 11652번 카드  (0) 2020.08.27
[백준] 9252번 LCS 2  (0) 2020.08.27
Comments