본문 바로가기
baekjoon

[그리디] 백준 1339 단어수학 C++

by HomieKim 2021. 8. 28.

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

 

1339번: 단어 수학

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

www.acmicpc.net



풀이 :

 가장 긴 자리수를 가진 알파벳부터 순서대로 9, 8, 7 ... 이런식으로 대입해서 계산하면 된다.

그래서 각자리 수를 가진 배열을 따로 만들고.. 나름대로 방법을 적용했는데 실패해서 솔루션을 찾아본 문제

가장 긴 자리수를 어떻게 찾을까? -> 10의 거듭제곱을 사용하면 된다 예제에 나온대로 GCF + ACDEB 경우 각 자리수를 10의 거듭제곱을 이용해서 표현해보면 

GCF = 100*G + 10*C + F * 1( 1은 10의 0승이니까)

ACDEB = 10000*A + 1000*C + 100*D + 10*E + B

GCF + ACDEB = 10000A +1010C +100D + 100G + 10E + 10C + B + F

 

이렇게 내림차순 으로 정렬에해서 순서대로 9,8,7,6,5...... 대입해주면 된다. 이때 길이가 26이 되는 알파벳 배열을 만들어야하는데 alpaArr의 0번 인덱스는 A 자릿수 값, 1번 인덱스는 B의 자릿수 값 이렇게넣고 내림차순 으로 정리하면 문제에서 주어진 2번 예제 경우에

[10000, 1010, 100, 100, 10, 10, 1, ,1, 0......] 이렇게 될테니 0번이 나올 때까지 9,8,7... 이순서대로 대입해서 더해주면 된다! 

 

코드 : 

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;
int n;
string s;
int alpaArr[27] = { 0, };
vector<string> strVec;
bool desc(int a, int b) {
	return a > b;
}
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s;
		strVec.push_back(s);
	}

	for (string str : strVec) {
		int len = str.length();
		int tmp = 0;
		for (int i = 0; i < len; i++) {
			int arrNum = str[i] - 'A';
			alpaArr[arrNum] += pow(10, (len - i)-1);
			tmp++;
		}
	}
	sort(alpaArr, alpaArr + 27, desc);
	int ans = 0;
	int tmp = 9;
	for (int i = 0; i < 27; i++) {
		if (alpaArr == 0) break;
		ans += tmp * alpaArr[i];
		tmp--;
	}
	cout << ans << endl;

	

}

'baekjoon' 카테고리의 다른 글

[DP] 백준 2225 합분해 C++  (0) 2021.09.01
[이분탐색] 백준 1920 수찾기 C++  (0) 2021.08.30
[DFS] 백준 2468 안전영역 C++  (0) 2021.08.26
[DP, DFS] 백준 1520 내리막길 C++  (0) 2021.08.24
[BFS] 백준 10026 적록색약 C++  (0) 2021.08.18

댓글