https://www.acmicpc.net/problem/1339
알파벳 대문자로 이루어진 단어 N개에 대해서 단어의 알파벳에 0~9로 1대1로 대응하여 변환할 때 단어들의 합이 최댓값을 구하는 문제이다. 알파벳의 종류는 최대 10개 까지 주어지고 단어의 갯수는 10개 이하, 단어의 길이는 8 이하이다. 하나의 숫자에 하나의 알파벳만 대응할 수 있으며, 알파벳에 수가 정해지면 다른 단어에서도 동일하게 적용된다. 각 알파벳 별로 가중치의 합을 구하여 가중치가 큰 알파벳 부터 큰 숫자를 부여하여 합을 구하는 방식으로 해결하였다.
가중치 저장을 위해 Map<Character, Long>을 이용하여 각 알파벳 별로 가중치를 자릿수에 맞게 저장하기 위해 Math.pow를 이용하였다.
Map<Character, Long> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String alpha = br.readLine();
for (int j = 0; j < alpha.length(); j++) {
map.merge(alpha.charAt(j), (long) Math.pow(10L, alpha.length() - j - 1), Long::sum);
}
}
이후 Map의 모든 Entry에 대해서 가중치의 크기로 정렬하여 큰 순서대로 큰 숫자를 대응 및 합해주면 되며, PriorityQueue와 커스텀 class를 사용하였다.
Queue<Alphabet> pq = new PriorityQueue<>(new Comparator<Alphabet>() {
@Override
public int compare(Alphabet o1, Alphabet o2) {
if (o1.number > o2.number) {
return -1;
} else if (o2.number > o1.number) {
return 1;
} else {
return 0;
}
}
});
for (Map.Entry<Character, Long> entry : map.entrySet()) {
pq.add(new Alphabet(entry.getKey(), entry.getValue()));
}
long start = 9L, sum = 0L;
while (!pq.isEmpty()) {
sum += pq.remove().number * start;
start--;
}
System.out.print(sum);
static class Alphabet {
char c;
long number;
public Alphabet(char c, long number) {
this.c = c;
this.number = number;
}
}
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
public class 단어수학1339 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Map<Character, Long> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String alpha = br.readLine();
for (int j = 0; j < alpha.length(); j++) {
map.merge(alpha.charAt(j), (long) Math.pow(10L, alpha.length() - j - 1), Long::sum);
}
}
br.close();
Queue<Alphabet> pq = new PriorityQueue<>(new Comparator<Alphabet>() {
@Override
public int compare(Alphabet o1, Alphabet o2) {
if (o1.number > o2.number) {
return -1;
} else if (o2.number > o1.number) {
return 1;
} else {
return 0;
}
}
});
for (Map.Entry<Character, Long> entry : map.entrySet()) {
pq.add(new Alphabet(entry.getKey(), entry.getValue()));
}
long start = 9L, sum = 0L;
while (!pq.isEmpty()) {
sum += pq.remove().number * start;
start--;
}
System.out.print(sum);
}
static class Alphabet {
char c;
long number;
public Alphabet(char c, long number) {
this.c = c;
this.number = number;
}
}
}
'알고리즘(백준 등) 공부 > 백준(자바)' 카테고리의 다른 글
| 백준 1341번: 사이좋은 형제 (0) | 2026.03.27 |
|---|---|
| 백준 1340번: 연도 진행 바 (0) | 2026.03.26 |
| 백준 1338번: 알 수 없는 번호 (0) | 2026.03.24 |
| 백준 1337번: 올바른 배열 (0) | 2026.03.23 |
| 백준 1334번: 다음 팰린드롬 수 (0) | 2026.03.22 |