[Algorithm Study] 백준 1755

21127 단어 algorithmalgorithm

문제 출처 : https://www.acmicpc.net/problem/1755

문제 접근

문제를 읽어보면 숫자를 그 자체로 보는 것이 아닌 각 자리수의 수를 영어로 읽어 정렬하는 방식입니다. 그래서 hashmap을 활용하여 0~9를 key로 하고 그에 해당하는 영어(zero~nine)을 value로 선언해 문제를 해결했습니다.
문자열을 비교하는데 있어서 자바에서 제공해주는 compareTo를 활용했습니다.
compareTo의 사용방식은 다음과 같습니다. 기준값.compareTo(비교 값)으로 사용됩니다.
기준 값과 비교 값이 숫자인 경우 (1)두 숫자가 같은 경우에는 0을 반환하며 (2)기준값이 비교 값보다 큰 경우에는 1(3) 기준값이 비교 값보다 작은 경우에는 -1을 반환해줍니다.
기준 값과 비교 값이 문자열인 경우에는 (1) 비교 값이 기준값에 포함되어 있는 경우에는 서로의 문자열 길이의 차를 반환 해줍니다. (단 앞글자부터 비교가 진행 즉, 기준값이 "abcd"이고 비교 값이 "bc"이면 앞글자부터 비교가 발생하므로 포함되어 있는 것으로 인식 X)
ex) "apple".compareTo("a") 이면 "a"는 "apple"에 포함되어 있으므로 4를 반환하게 됩니다.
(2) 비교 값이 기준값에 포함되어 있지 않은 경우에는 앞 글자의 유니코드 값의 차를 반환해 줍니다.
ex) "apple".compareTo("b")이면 "a"의 유니코드 값은 97 "b"의 유니코드 값은 98이므로 -1이 반환됩니다.
이를 활용하여 각 숫자들의 영어들은 서로 포함되거나 포함하는 경우가 없기에 각 숫자의 영어를 비교했을 때 음수가 반환되면 사전 순으로 앞선 수라고 하여 문제를 해결했습니다.

소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class BOJ_1755 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        HashMap<Character, String> dic = new HashMap<Character, String>();
        dic.put('0', "zero");
        dic.put('1', "one");
        dic.put('2', "two");
        dic.put('3', "three");
        dic.put('4', "four");
        dic.put('5', "five");
        dic.put('6', "six");
        dic.put('7', "seven");
        dic.put('8', "eight");
        dic.put('9', "nine");
        st = new StringTokenizer(br.readLine());
        String start = st.nextToken();
        String end = st.nextToken();
        int[] num = new int[Integer.parseInt(end)-Integer.parseInt(start)+1];
        int idx = 0;
        for(int i = Integer.parseInt(start); i <= Integer.parseInt(end); i++){
            num[idx++] = i;
        }
        for(int i = 0; i < idx-1; i++){ // 기준
            int small = i;
            for(int j = i+1; j < idx; j++){ // 비교대상
                String num1 = String.valueOf(num[small]);
                String num2 = String.valueOf(num[j]);
                for(int k = 0; k < num1.length(); k++){ //비교과정
                    if(dic.get(num1.charAt(k)).compareTo(dic.get(num2.charAt(k)))>0){
                        small = j;
                        break;
                    }
                    else if(dic.get(num1.charAt(k)).compareTo(dic.get(num2.charAt(k))) == 0){
                        if(num1.length() > num2.length()){
                            small = j;
                            break;
                        }
                    }
                    else if(dic.get(num1.charAt(k)).compareTo(dic.get(num2.charAt(k)))<0) break;
                }
            }
            int temp = num[small];
            num[small] = num[i];
            num[i] = temp;
        }
        for(int i = 0; i < idx; i++){
            System.out.print(num[i]+" ");
            if(i % 10 == 9) System.out.println();
        }
    }
}

좋은 웹페이지 즐겨찾기