-

[BOJ - JAVA] 1339 - 단어 수학(그리디, 브루트포스) 본문

백준 문제 풀이

[BOJ - JAVA] 1339 - 단어 수학(그리디, 브루트포스)

흣차 2021. 9. 30. 00:16
728x90
반응형

# 주소

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

 

1339번: 단어 수학

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

www.acmicpc.net

 

 

# 문제

 

# 문제 해설 및 코드 리뷰

import java.util.*;
import java.io.*;
public class Main{
    public static HashMap<String, Integer> map;
    public static int result = 0;
    public static int value = 9;
    public static void main(String[] args) throws IOException, NumberFormatException {
        map = new HashMap<String, Integer>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        
        for(int i = 0; i < n; i++) {
            String str = br.readLine();
            int x = 0;
            for(int j = str.length() - 1; j >= 0; j--){
                int a = (int)Math.round(Math.pow(10,x));
                if(!map.containsKey(str.charAt(j) + "")){
                    map.put(str.charAt(j) + "", a);
                }
                else {
                    int prev = map.get(str.charAt(j) + "");
                    int ff = prev + a;
                    map.put(str.charAt(j) + "", ff);
                }
                x += 1;
            }
        }
        Iterator<String> mapIter = map.keySet().iterator();
        while(mapIter.hasNext()){
            String key = mapIter.next();
            int value = map.get(key);
        }
        List<String> keySetList = new ArrayList<>(map.keySet());
        Collections.sort(keySetList, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));
        for(String key : keySetList) {
            result += map.get(key) * value;
            value--;
        }
        System.out.println(result);
    }
}

사실 BufferedWriter은 다 써놓고 보니 필요가 없는데 Reader를 쓰는 김에 습관적으로 썼습니다.

n은 Integer형태로 전환시켜서 입력받습니다.

그리고 n의 값에 따라 for문의 형태로서 String 타입으로 str을 입력 받고 int 타입의 x = 0으로 초기화합니다.

이후 다시 for문으로 들어가, str의 길이만큼 Hashmap에 String과 Key값을 담습니다.

기본적으로 HashMap은 중복을 허용하지 않고 검색이 아주 빠르기 때문에 자주 사용됩니다.

그리고 10의 x제곱만큼을 계산하여 반올림하고 int형태로 변환시켜 a에 저장합니다.(제곱할 때 소수 형태로 나오기 때문에)

(x는 처음엔 0이고 이후에 for문이 지날 때마다 1씩 증가시킵니다.)

그리고 처음엔 map이 key를 가지고 있지 않기 때문에 map에 첫 번째 문자와 a값을 넣습니다.

(이 때 a는 10의 거듭제공 형태입니다.)

이후 같은 문자가 나오면 원래 문자열의 value값과 현재의 a값을 더한 형태로 저장합니다

예) ABA일경우 A : 101, B : 20이라 가정할 때 A 는 100 + 1, B는 20이므로 ABA : 121입니다.

그리고 Iterator를 이용하여 map의 key를 반복수행하는 생성자를 mapIter라고 선언하겠습니다.

ArrayList타입의 keySetList를 생성하고 람다식을 이용하여 오름차순으로 정렬했습니다.

 

이후 아까 생성했던 mapIter의 key와 value 값을 각각 key와 value라고 선언했었는데, 

이것들을 가지고 map.get(key) * value값을 result에 더합니다. 

알파벳의 값은 내림차순이어야 하므로 value--;를 꼭 넣고 result를 출력하면 되겠습니다.

 

Hashmap을 이렇게 깊게 파고든 전 이 문제가 처음인 것 같습니다. ArrayList를 오름차순으로 정렬할 때 Collections.sort만 써도 된다고 생각했는데, 인터넷 찾아보니 hashmap인 경우엔 조금 다른 것 같습니다.

 

 

 

 

 

728x90
반응형
Comments