영벨롭 개발 일지

[백준 BOJ][C++]1339번 단어 수학 풀이: 브루트 포스 본문

알고리즘 문제 풀이/BOJ

[백준 BOJ][C++]1339번 단어 수학 풀이: 브루트 포스

영벨롭 2022. 5. 11. 14:09

https://www.acmicpc.net/problem/1339

 

1339번: 단어 수학

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

www.acmicpc.net

 

 초기 풀이에선 자리수에 따라 단어들을 일일이 비교하며 해당 알파벳에 숫자를 부여하였더니 틀렸습니다가 떠서 구글링에 힘을 얻어 해결하였습니다..ㅎㅎ

 

 몇몇 사이트를 참고하니 풀이과정은 생각보다 간단했습니다. 

 

 각각의 단어에서 해당 알파벳의 자릿수를 저장해두고 해당 자릿수들의 모임을 내림차순 정렬하여 9부터 차례대로 숫자를 곱하여 더해주면 됩니다. 

 

 

 

#include<iostream>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>

using namespace std;

int n;
int num[27] = { 0, };
vector<string> words;
priority_queue<int, vector<int>, less<int>> pq;

void set_num() {

	for (int i = 0; i < n; i++) {
		int pow = 1;
		for (int j = words[i].size() - 1; j >= 0; j--) {
			int alpha = words[i][j] - 65;
			num[alpha] += pow;
			pow *= 10;
		}
	}

	for (int i = 0; i < 27; i++) {
		if (num[i] != 0)
			pq.push(num[i]);
	}
}

int solution() {

	int sum = 0;
	int cnt = 9;
    
    set_num();

	while (!pq.empty()) {
		sum += (pq.top() * cnt);
		pq.pop();
		cnt--;
	}

	return sum;
}

int main(void) {

	cin >> n;

	for (int i = 0; i < n; i++) {
		string temp;
		cin >> temp;
		words.push_back(temp);
	}
	sort(words.begin(), words.end(),
		[](string a, string b) { return a.size() > b.size(); });

	cout << solution() << endl;


	return 0;
}
반응형