두번째 골드레벨을 클리어했다!
원리는 간단하다.
입력받은 문자를 배열로 만든 후 각 문자의 자리 수를 구하여 10의 거듭제곱으로 변환 후 문자를 키로, 변환 한 숫자를 값으로 맵에 넣는다. 이미 해당 키가 있을 시에는 값을 불러와서 더한다.
EX) ABA -> map.put('A', 100); map.put('B', 10); map.put('A', map.get('A') + 1);
그런 다음 해당 map을 값으로 정렬하여 list에 담고 해당 list의 요소들을 작은 것부터 순서대로 숫자를 매겨서 새 map에 넣는다.
(B, 8), (A,9)
그러고나서 처음에 입력받은 문자열을 map에 key로 넣어서 해당하는 숫자로 변환하여 stringbuilder에 append한다.
모두 append하면 parseInt를 통하여 숫자로 만든 후 최대값을 저장하는 변수에 저장한다.
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
List<char[]> list = new ArrayList<>();
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
char[] cArr = br.readLine().toCharArray();
for (int j = 0; j < cArr.length; j++) {
if (map.containsKey(cArr[j])) {
map.put(cArr[j], map.get(cArr[j]) + (int)Math.pow(10, cArr.length - j - 1));
} else {
map.put(cArr[j], (int)Math.pow(10, cArr.length - j - 1));
}
}
list.add(cArr);
}
List<Map.Entry<Character, Integer>> list2 = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toList());
Map<Character, Integer> map2 = new HashMap<>();
int num = 10 - list2.size();
for (Map.Entry<Character, Integer> entryMap : list2) {
map2.put(entryMap.getKey(), num++);
}
int max = 0;
for (char[] charArr : list) {
StringBuilder sb = new StringBuilder();
for (char c : charArr) {
sb.append(map2.get(c));
}
max += Integer.parseInt(sb.toString());
}
System.out.println(max);
}
}
'코테' 카테고리의 다른 글
백준 1195번 : 킥다운 (1) | 2024.01.09 |
---|---|
백준 1700번 : 멀티탭 스케쥴링 (0) | 2024.01.06 |
백준 12904번 : A와 B (0) | 2023.12.23 |
백준 10991번 : 별 찍기 - 16 (0) | 2023.11.24 |
백준 2445번 : 별 찍기 - 8 (0) | 2023.11.21 |