c++/알고리즘

[c++] 백준 - 단어수학

hojung 2023. 1. 31.
728x90
반응형

1. 문제

2. 입출력

3. 문제 해설

 

처음엔 완전 해맸다. 

처음엔 단어의 개수가 N(1<= N <= 10)개 이므로 vector <char> v[11]을 만들어 최대 길이 부터 하나씩 제거해가야하나... 라는 생각으로 stack에 queue에 많은 자료구조들을 적용시켜 보았다. 하지만 골드 4의 난이도에 비해 신경쓸 점이 너무 많았고 이렇게 푸는 거 말고 좀 더 쉬운 방법이 있을 수 있다는 생각이 들어 다시 키보드에서 손을 때고 이면지에 끄적이기 시작했다. 

 

우선 이 문제는 자리수가 굉장히 중요한 문제였다. 자리수가 높으면 높을수록 높은 숫자를 가져가기 때문이다. 

 

예제와 같이 

GCF

ACDEB가 있을 때

 

A가 가장 높은 자리 이므로 9 

C는 그 다음 높은 자리 이므로 8

G와 D는 각각 1번씩 나오고 그 다음 높은 자리이므로 둘 중에 하나는 7 하나는 6이 된다. 

 

이런 식으로 정렬을 해줘야한다. 

 

그런데 여기서 문제는 하나의 문자가 2번 이상 나올 때였다. 

2번 이상 나온다면 같은 자리 수에 해당하는 문자라도 빈도 수에 따라 배당되는 숫자가 달라지기 때문이다. 

따라서 나는 

struct alpha {
    int idx;
    int val;
}

위와 같은 구조체를 하나 만들어 뒤에서 부터 10을 곱한 값을 val에 더해주었다. 

 

예를 들면 

GCF라면

F는 1 

C는 10

G는 100

 

ACDEB라면

B = 1;

E = 10;

D = 100;

C = 아까 위에 10이 이미 더해진 상태이므로 10 + 1000 = 1010

A = 10000

 

위처럼 값을 넣으면 alphabet배열이 다음과 같이 된다. 

 

  A B C D E F G
idx 1 2 3 4 5 6 7
val 10000 1 1010 100 10 1 100

그 후 custom compare함수를 작성해 위의 배열을 정렬해주었다. 

  A C D G E B F
idx 1 3 4 7 5 2 6
val 10000 1010 100 100 10 1 1

위와 같이 정렬된 배열을 차례대로 

int num = 9;
int ans = 0;
for(int i=0; i < 26; i++) {
	if(alphabet[i].idx == 0) break;
    ans += alphabet[i].val * num;
    num --;
}

다음과 같이 작성해주면 최종 결과가 나온다. 

 

#pragma warning (disable : 4996)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct alpha {
	int idx;
	int val;
};
int N; // 단어의 개수
alpha alphabet[26];
int ans;
bool cmp(alpha a, alpha b) {
	if (a.val > b.val) return true;
	else return false;
}
void input() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		string temp;
		cin >> temp;
		int idx = 1;
		for (int i = temp.size()-1; i >= 0; i--) {
			alphabet[temp[i] - 'A'].val += idx;
			alphabet[temp[i] - 'A'].idx = temp[i] - 'A'+1;
			idx *= 10;
		}
	}
}

void sol() {
	sort(alphabet, alphabet + 26, cmp);
	int num = 9;
	for (int i = 0; i < 26; i++) {
		if (alphabet[i].idx == 0) break;
		ans += (num * alphabet[i].val);
		num--;
	}
}
int main() {
	std::ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	input();
	sol();
	cout << ans << "\n";
	return 0;
}

728x90
반응형

'c++ > 알고리즘' 카테고리의 다른 글

[c++] 인덱스드 트리에 관하여  (2) 2023.02.01
[c++] 백준-퇴사2 (dynamic programming)  (0) 2023.02.01
[C++] 백준 - 전구  (1) 2023.01.30
[C++] 백준 - 두 배열의 합  (1) 2023.01.30
[c++] 위상정렬 백준-게임개발  (0) 2023.01.27

댓글