suheang

[백준] | JAVA, 자바 | 1755번 - 숫자놀이 본문

알고리즘

[백준] | JAVA, 자바 | 1755번 - 숫자놀이

suheang 2024. 4. 18. 21:56

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

 

1755번: 숫자놀이

79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로

www.acmicpc.net


문제 요약 :

79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로 먼저 온다.

문제는 정수 M, N(1 ≤ M ≤ N ≤ 99)이 주어지면 M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력

 

( M 이상 N 이하의 정수를 문제 조건에 맞게 정렬하여 한 줄에 10개씩 출력 )


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

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 m = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());
        ArrayList<String> numbers = new ArrayList<>();

        for (int i = m; i <= n; i++) {
            numbers.add(numberToString(i));
        }

        Collections.sort(numbers);

        for (int i = 0; i < numbers.size(); i++) {
            System.out.print(stringToNumber(numbers.get(i)));
            if (i != 0 && i % 10 == 9) {
                System.out.println();
            } else {
                System.out.print(" ");
            }
        }
    }

    public static String numberToString(int number) {
        Map<Integer, String> strMap = new HashMap<>();
        strMap.put(0, "zero");
        strMap.put(1, "one");
        strMap.put(2, "two");
        strMap.put(3, "three");
        strMap.put(4, "four");
        strMap.put(5, "five");
        strMap.put(6, "six");
        strMap.put(7, "seven");
        strMap.put(8, "eight");
        strMap.put(9, "nine");

        StringBuilder result = new StringBuilder();
        String num = String.valueOf(number);
        for (int i = 0; i < num.length(); i++) {
            int digit = Character.getNumericValue(num.charAt(i));
            result.append(strMap.get(digit)).append(" ");
        }
        return result.toString().trim();
    }

    public static int stringToNumber(String number) {
        Map<String, Integer> intMap = new HashMap<>();
        intMap.put("zero", 0);
        intMap.put("one", 1);
        intMap.put("two", 2);
        intMap.put("three", 3);
        intMap.put("four", 4);
        intMap.put("five", 5);
        intMap.put("six", 6);
        intMap.put("seven", 7);
        intMap.put("eight", 8);
        intMap.put("nine", 9);

        String[] numbers = number.split(" ");
        int result = 0;
        for (String num : numbers) {
            result = result * 10 + intMap.get(num);
        }
        return result;
    }
}

 

1. 정수 m, n 입력받기

2. m 이상 n 이하의 정수를 numberToString에 넘겨주고 numbers에 저장

2 - 1. HashMap을 사용해 숫자와 문자열을 매핑

2 - 2. String num을 생성하고 매개변수로 받은 num의 값을 문자열로 변환

(문자열로 변환하는 이유는 한 자릿수 이상의 숫자가 들어올 수 있기 때문)

2 - 3. Character.getNumericValue 메서드를 사용해 주어진 문자에서 해당하는 숫자 값을 반환

2 - 4. 반환된 숫자를 매핑해서 문자열로 변경하고 추가

2 - 5. 앞과 뒤의 공백을 제거하고 리턴

3. 저장된 numbers를 사전 순으로 정렬

4. 정렬된 numbers를 stringToNumber을 사용해 숫자로 출력

4 - 1. HashMap을 사용해 문자열과 숫자를 매핑

4 - 2. String 배열을 생성하고 공백을 기준으로 구분

4 - 3. for문을 통해 문자열을 숫자로 변환 후 리턴

5. 한 줄에 10개씩 출력되게 if문 설정