단어수학 문제는, N개의 단어로 이루어짐.
무슨 말이냐면
“GCF” 라는 단어와 “ACDEB” 라는 단어가 있을 때, A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정 한다면 → 두 수의 합은 : 783 + 98654 = 99437 이 된다. 그리고 이와 같이, 각 알파벳에 값을 지정했을 때가 두 수의 합이 최대가 되는 때이다.
N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램???
일단 여기서 생각나는 것이 하나 있다.
이거 그냥 location 별로 나누고 곱하고 더해서 그 크기로 정렬하면 되는 것 같다...ㅠㅠㅠ....하.. 갑자기 생각났다.
무슨 말이냐면, alphabet 별로, 미리 값을 다 계산해 둔다. 예를들어
ABGDE 와 GCF라면
A : 10000
B : 1000
C : 10
D : 10
E : 1
F : 1
G : 200
이 되는 것이다. → 그러면 이 값 순으로 정렬을 해서, 큰 값을 가지는 애한테 큰 값을 할당해 주면 되는 것이다.
큰 자리수라고 무조건 큰 값을 할당해야한다고 생각하면 틀리게 된다.
그리고 그 할당된 값을 곧바로 곱하고 더해주고 하면 바로 문제에서 원하는 결과값까지도 구할 수가 있다.
import java.io.*;
import java.util.*;
public class Main{
public static int len = 'z'-'a'+1;
public static int n;
public static int[] alphaValue = new int[len];
public static int[] alphaCnt = new int[len];
public static class Element{
public int ch; // character
public int val; // count 값 ex)10000 2000.. 이런거
public Element(int ch, int val) {
this.ch = ch;
this.val = val;
}
}
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static StringTokenizer st;
public static void setting() throws IOException {
n = Integer.parseInt(br.readLine());
String temp = null;
int pow = 1;
for (int i = 0; i < n; i++) {
temp = br.readLine();
for(int idx = 0 ; idx< temp.length();idx++){
pow = (int)Math.pow(10,temp.length()-idx-1);
alphaCnt[temp.charAt(idx)-'A'] += pow;
}
}
}
public static int solve(){
// 알파벳별로 count에 의한 내림차순 정렬
Element[] arr = new Element[len];
for(int i =0 ;i <len;i++){
arr[i] = new Element(i,alphaCnt[i]);
}
Arrays.sort(arr,(o1,o2)->o2.val-o1.val);
// 알파벳에게 값을 할당한다
int number = 9;
for(int i =0 ;i <len;i++){
if(arr[i].val != 0) alphaValue[arr[i].ch] = number--;
}
// 최종값 구하기
int sum = 0;
for(int alpha = 0 ; alpha<len;alpha++){
sum += alphaCnt[alpha]*alphaValue[alpha];
}
return sum;
}
public static void main(String[] args) throws IOException{
setting();
System.out.println(solve());
}
}