백준 -1339

문딤·2022년 8월 12일
0

단어 수학

https://www.acmicpc.net/problem/1339

풀이 생각

  1. 단어의 합의 최댓값?
  2. 처음오는 글자부터 순차적으로 9->0 순으로 값을 가지게 해야겠다.
  3. HashMap 형식으로 key에는 글자 , value에는 수를 넣어야겠다.

소스코드

Main


 public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb;

        //N 개의 단어로 이루어져 있으며, 알파벳 대문자로 이루어짐.
        int N =Integer.parseInt(br.readLine());
        String [] arr = new String[N];
        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            sb = new StringBuilder(str);
            arr[i] = sb.reverse().toString();
        }
        Arrays.sort(arr, (s1,s2)-> s2.length()-s1.length());

        HashMap<Character,Integer> map = new HashMap<>();

        int start = arr[0].length()-1;

        for (int i = start; i >=0 ; i--) {
            for (int j = 0; j < N; j++) {
                if(i >= arr[j].length()){
                    break;
                }
                char c = arr[j].charAt(i);
        if(!map.containsKey(c)){
            map.put(c, (int) Math.pow(10,i));
        }else{
            map.put(c,map.get(c) + (int)Math.pow(10,i));
        }}}
        List<Integer> list = new ArrayList<>();
        Iterator<Character> it = map.keySet().iterator();

        // list에 map의 value를 담음.
        while (it.hasNext()) {
            char c = it.next();
            list.add(map.get(c));
        }

        // 내림차순 정렬.
        Collections.sort(list, (a, b) -> b - a);

        int num = 9;
        int ans = 0;

        for (int i = 0; i < list.size(); i++) {
            ans += list.get(i) * num--;
        }
        // 첫 문자에 9~>0으로 할당해줘야겠네

        System.out.println(ans);

    }

MAP에 자릿수 값으로 거듭제곱 10씩 곱해주기

  HashMap<Character,Integer> map = new HashMap<>();

        int start = arr[0].length()-1;

        for (int i = start; i >=0 ; i--) {
            for (int j = 0; j < N; j++) {
                if(i >= arr[j].length()){
                    break;
                }
                char c = arr[j].charAt(i);
        if(!map.containsKey(c)){
            map.put(c, (int) Math.pow(10,i));
        }else{
            map.put(c,map.get(c) + (int)Math.pow(10,i));
        }}}

iterator 사용법

Iterator<Character> it = map.keySet().iterator();

        // list에 map의 value를 담음.
        while (it.hasNext()) {
            char c = it.next();
            list.add(map.get(c));
        }

생각할 것

  1. Map => value에 자릿수를 넣고 곱한다를 생각하는데 시간이 많이 걸렸다.
  2. reverse해서 계산이 편하게 하는것도 생각하는데 시간이 걸렸다.

공부할 것

그리디 알고리즘, 더 많은 문제

profile
풀스택개발자가 될래요

0개의 댓글