키워드
단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다.
각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제
두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다.
N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램
구현
- 각 자릿수의 가중치만큼을 계산해서 더해준다.
- N개의 단어라고해서 알파벳 A부터 Z까지의 알파벳을 전부 사용하는 것이 아니다.
두 개 이상의 알파벳이 같은 숫자로 바뀌면 안되므로 입력에서 10종류 이하의 알파벳 단어만 주어질 것이다.
→ Map을 이용하여 사용된 알파벳의 Key, 알파벳 가중치 Value를 저장한다.
- 각 자릿수의 가중치를 저장한 Map에서 Value의 내림차순으로 9에서 0까지 배치한다.
배치와 동시에 가중치와 곱하여 결과에 더해준다.
Map을 Value기준으로 정렬하는 방법
Map.entrySet() 메서드를 이용한다.
해당 메서드를 이용하면 Entry객체의 List형식으로 반환이 된다.
이 때 Entry.comparingByValue() 메서드를 이용하여 값을 통한 정렬을 수행한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class java_1399 {
static int N;
// 각 알파벳 대문자를 0~9까지 숫자중 하나로 바꿔서 합
// 두 개 이상이 같은 숫자 X
static StringBuffer words[];
public static void main(String[] args) throws IOException {
// GCF + ACDEB
// 각 자릿수만큼 가중치를 두어 맵에 저장한다.
// 맵에 값에서 가장 큰것부터 큰 값을 할당한다.
// ex] ABBBB A:10000 B:3000
// A가 9가 되는 것이 이득이다.
// 최대값 100_000_000
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
words = new StringBuffer[N];
for (int i = 0; i < N; i++) {
words[i] = new StringBuffer(br.readLine()).reverse();
}
int result = solution();
System.out.println(result);
br.close();
}
private static int solution() {
Map<Character, Integer> alphaMap = new HashMap<>();
for (StringBuffer word : words) {
// 현재 단어를 더해주기
int exp = 1;
for (int i = 0; i < word.length(); i++) {
// 현재 알파벳 추출
char thisAlpha = word.charAt(i);
// 자릿수에 따른 가중치 값 가산
int alphaValue = alphaMap.getOrDefault(thisAlpha, 0);
alphaMap.put(thisAlpha, alphaValue + exp);
// 자릿수 증가
exp *= 10;
}
}
List<Entry<Character, Integer>> entryList = new ArrayList<Entry<Character, Integer>>(alphaMap.entrySet());
// value 의 내림차순 정렬
entryList.sort(Entry.comparingByValue((o1, o2) -> o2 - o1));
int result = 0;
int number = 9;
for (Entry<Character, Integer> entry : entryList) {
result += entry.getValue() * number;
number--;
// System.out.println(entryList);
}
return result;
}
}
Uploaded by N2T
'Coding Test > BOJ' 카테고리의 다른 글
[BOJ/JAVA] 16958번: 텔레포트 (0) | 2023.04.03 |
---|---|
[BOJ/JAVA] 23559번: 밥 (0) | 2023.04.03 |
[BOJ/JAVA] 27313번: 효율적인 애니메이션 감상 (0) | 2023.04.03 |
[BOJ/JAVA] 1744번: 수 묶기 (0) | 2023.04.03 |
[BOJ/JAVA] 1198번: 삼각형으로 자르기 (0) | 2023.04.03 |