아이디어
높은 자리에서 가장 많이 나오는 순서대로 9, 8, 7, …등을 할당한다.
어떤 자릿수에 대해 나온 횟수가 동일하다면 다음으로 작은 자릿수를 비교하고, 우열이 결정될 때까지 반복한다.
1의 자리에서도 결정이 안 난다면 그 둘 사이에는 어찌되도 상관 없다.
- 각 문자가 등장할 때마다 그 문자의 자릿수 가중치(10k)를 누적한 값이 높으면 높은 숫자를 할당한다.
- 그렇게 한 결과 ‘0’으로 시작한 문자열이 있다면 현재 일의 자리를 다음 자리와 바꾸고, 그래도 안 되면 더 높은 자리로 바꾸고… 등을 반복한다.
- 각 자릿수와 0~9까지에 대해 (그 숫자에 해당하는 문자가 그 자리에 나온 횟수 문자에 해당하는 숫자값 자릿수에 대한 가중치)의 합을 구하면 답이 될 것이다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
static int N;
static char[][] strs;
static long[] weights = new long['J'+1];
static long[] pow10 = new long[12];
static int[] values = new int['J'+1];
public static void main(String[] args) throws Exception {
pow10[0] = 1L;
for (int i=1; i<12; i++) pow10[i] = pow10[i-1] * 10L;
N = Integer.parseInt(rd.readLine());
strs = new char[N][];
for (int i=0; i<N; i++) {
char[] s = rd.readLine().trim().toCharArray();
strs[i] = s;
for (int j=0; j<s.length; j++) {
weights[s[s.length-1-j]] += pow10[j];
}
}
Character[] chs = new Character[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
Arrays.sort(chs, (a, b) -> weights[a] < weights[b] ? -1 : 1);
boolean zeroLead = true;
int idx = 1;
while (zeroLead) {
for (int i = 0; i < N; i++) {
zeroLead = (strs[i][0] == chs[0]);
if (zeroLead) {
Character tmp = chs[0];
chs[0] = chs[idx];
chs[idx] = tmp;
idx++;
break;
}
}
}
for (int i=0; i<10; i++) {
values[chs[i]] = i;
}
long sum = 0;
for (int i=0; i<N; i++) {
int len = strs[i].length;
for (int j=0; j<len; j++) {
sum += values[strs[i][len-1-j]] * pow10[j];
}
}
System.out.println(sum);
}
}
메모리 및 시간
리뷰
이전 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
static BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
static int N;
static char[][] strs;
static int[][] cnts = new int['J'+1][12];
static long[] pow10 = new long[12];
public static void main(String[] args) throws Exception {
pow10[0] = 1L;
for (int i=1; i<12; i++) pow10[i] = pow10[i-1] * 10L;
N = Integer.parseInt(rd.readLine());
strs = new char[N][];
for (int i=0; i<N; i++) {
char[] s = rd.readLine().trim().toCharArray();
strs[i] = s;
for (int j=0; j<s.length; j++) {
cnts[s[j]][s.length-1-j]++;
}
}
Character[] chs = new Character[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
Arrays.sort(chs, new Comparator<Character>() {
@Override
public int compare(Character a, Character b) {
return compareWeight(a, b, 11);
}
int compareWeight(char a, char b, int weight) {
if (weight == -1)
return 0;
int result = cnts[a][weight] - cnts[b][weight];
if (result == 0)
return compareWeight(a, b, weight-1);
return result;
}
});
boolean zeroLead = true;
int idx = 1;
while (zeroLead) {
for (int i = 0; i < N; i++) {
zeroLead = (strs[i][0] == chs[0]);
if (zeroLead) {
Character tmp = chs[0];
chs[0] = chs[idx];
chs[idx] = tmp;
idx++;
break;
}
}
}
long sum = 0;
for (int i=0; i<12; i++) {
for (int j=9; j>=0; j--) {
sum += cnts[chs[j]][i] * j * pow10[i];
}
}
System.out.println(sum);
}
}