[백준] 단어 수학 1339번 - Java

[백준] 단어 수학 1339번

나의 풀이

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로 바꿔주고, 다시 정수로 바꿔서 더해주는 방식으로 접근하였었다. 멍청했다. 반성한다.

좋은 웹페이지 즐겨찾기