[백준] 단어 수학 1339번 - Java
나의 풀이
public class WordMath {
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();
}
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < N; i++) {
String word = words[i];
for(int j = 0; j < word.length(); j++) {
char ch = word.charAt(j);
map.put(ch, map.getOrDefault(ch, 0) + (int)Math.pow(10, word.length() - 1 - j));
}
}
int[] values = map.values().stream().sorted(Collections.reverseOrder()).mapToInt(i -> i).toArray();
long answer = 0;
for(int i = 0, num = 9; i < values.length; i++, num--) {
answer += values[i] * num;
}
System.out.println(answer);
}
}
- 아이디어가 떠오르지 않았다. 문제를 해결하기 위한 아이디어는 각 문자열의 자리수를 숫자의 자리수로 생각하여 접근하는 것이였다.
ex) ABC -> A는 100의 자리, B는 10의 자리, C는 1의 자리
자리수를 가장 많이 차지하는 알파벳이 가장 큰 숫자가 된다.
A -> 9, B -> 8, C -> 7 이 된다. - 해당 알파벳의 자리수를 기억하기 위해 맵을 사용하였다.
- 입력받은 단어의 갯수만큼 반복하면서 각 문자열의 알파벳을 키 값으로 잡고, 해당 단어에서 차지하는 자리수를 구하기 위해 해당 (단어의 길이 - 1) - j 를 해주었다. 그리고 이 숫자만큼 10의 제곱을 해주어 밸류 값으로 사용하였다.
- 구해진 밸류 값들을 오름차순으로 정렬하여 배열을 만들고, 차례대로 9부터 1씩 빼면서 곱해주고 answer 에 더해주면 된다.
느낀점
처음에 해당 문자이 만약 AB라면 맵에서 해당 알파벳을 찾아서 replace로 바꿔주고, 다시 정수로 바꿔서 더해주는 방식으로 접근하였었다. 멍청했다. 반성한다.
Author And Source
이 문제에 관하여([백준] 단어 수학 1339번 - Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@goshk95/백준-단어-수학-1339번-Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)