ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1339 (단어 수학)
    백준 문제 2024. 2. 5. 19:27
    728x90

    문제

     

    1339번: 단어 수학

    첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

    www.acmicpc.net

    n개의 영어 대문자로 주어진 문자열이 주어진다.

    문자열의 알파벳에 0 ~ 9 까지의 숫자를 부여한뒤 n개의 문자열을 더했을 때 가장 큰 수가 나오게 하는 문제이다.

    0~9 까지 이기 때문에 주어지는 모든 문자열의 알파벳은 최대 10가지이다.

    예를 들어, GCF + ACDEB를 계산한다고 할 때, A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정한다면, 두 수의 합은 99437이 되어서 최대가 될 것이다.


    처음에는 단순히 문자열의 길이가 가장 긴 순서대로 정렬한 후에 자릿수가 높은 알파벳에 가장 큰 수를 주는 방식으로 구현하려 했었다.

    하지만 위에 예시와 같이 ACDEB 와 GCF를 보면 ACDEB가 문자열의 길이가 길기 때문에 98765 이런식으로 결정하려 했지만, 

    결과는 AC까지는 자릿수가 높기 때문에 맞지만, DEB의 D와 GCF의 G는 누가 더 높은 우선순위를 가질지 애매해졌다.

    결국 방법을 찾지 못하고 구글링의 정보를 찾았다.

     

    어차피 정답은 모든 문자열의 "합" 이기 때문에 각 알파벳마다 자릿수를 더해주었다.

    예를 들어 ACDEB는 10000(A) + 1000(C) + 100(D) + 10(E) + 1(B) 형식이다.

    또 GCF = 100(G) + 10(C) + 1(F) 로 정해주었다.

    그렇게 되면 결국 10000(A) * 9 + 1010(C) * 8 + 100(G 또는 D) * 7 + 100(G 또는 D) * 6 + 10(E 또는 C) * 5 + 10(E 또는 C) * 4 + 1(B 또는 F) * 3 + 1(B 또는 F) * 2 이다.


    전체 코드이다.

    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            int n = Integer.parseInt(st.nextToken());
    
            Map<Character, Integer>map = new HashMap<>();
            for(int i = 0;i<n;i++) {
                String s = br.readLine();
                for(int j=0;j<s.length();j++) {
                    Character c = s.charAt(j);
                    if(!map.containsKey(c)) {
                        map.put(c, power(s.length()-j-1));
                    }
                    else{
                        int target = map.get(c);
                        map.put(c, target + power(s.length()-j-1));
                    }
                }
            }
    
            List<Integer>list = new ArrayList<>(map.values());
            Collections.sort(list, Collections.reverseOrder()); //계산된 알파벳 값을 기준으로 내림차순 정렬
    		[10000, 1010, 100, 100, 10, 10, 1, 1]
            
            int injection = 9;
            int ans = 0;
            for(Integer i : list){
                ans += injection * i;
                injection--;
            }
    
            System.out.println(ans);
        }
        private static int power(int z){
            int num = 1;
            for(int i = 0;i<z;i++){
                num *=10;
            }
            return num;
        }
    }

     

    '백준 문제' 카테고리의 다른 글

    백준 1912 (연속합)  (0) 2024.02.08
    백준 12869 (뮤탈리스크)  (0) 2024.02.06
    백준 11000 (강의실 배정)  (0) 2024.02.02
    백준 9466 (텀 프로젝트)  (0) 2024.02.02
    백준 11581 (구호물자)  (1) 2024.02.01
Designed by Tistory.