문제
백준 1339번 - 단어 수학
아이디어
- 현재 선택이 가장 최선의 선택이라고 보는 그리디 관점에서 생각해본다.
- 각 알파벳의 가중치, 즉 자릿수가 높을수록 높은 숫자를 받는 것이 유리하다.
- 각 단어의 각 알파벳별로 자릿수의 합을 구한 다음, 높은 자릿수부터 높은 숫자를 할당하여 누적합을 구해준다.
예상 시간 복잡도
- 단어별로 단어의 길이만큼 가중치를 계산하는 로직이 가장 오래 걸릴 것이다.
- 예상 시간 복잡도 :
O(N * 수의 길이)
코드 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_1339 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] words = new String[n];
for (int i = 0; i < n; i++) {
words[i] = br.readLine();
}
int[] alphaWeight = new int[26]; //알파벳별 가중치
for (String word : words) {
int len = word.length();
for (int i = 0; i < len; i++) {
char ch = word.charAt(i);
alphaWeight[ch - 'A'] += (int) Math.pow(10, len - i - 1); //해당 자릿수가 몇 번 나오는지 계산
}
}
Arrays.sort(alphaWeight);
int num = 9;
int result = 0;
for (int i = 25; i >= 0; i--) {
if (alphaWeight[i] == 0) {
break;
}
result += alphaWeight[i] * num--; //높은 자릿수부터 높은 숫자를 할당하여 누적합 계산
}
System.out.println(result);
}
}