본문 바로가기
코딩테스트 준비/백준

[백준] 9627번 - 문장 [Java]

by mwzz6 2025. 2. 12.

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

 

[백준] 9627번 - 문장 [Java]
[백준] 9627번 - 문장 [Java]
[백준] 9627번 - 문장 [Java]


1.  아이디어

 

Map 자료구조와 StringBuilder로 숫자에 해당하는 글자를 구하는 방식으로 해결했다.


2. 문제풀이

 

1부터 9와 10의 배수들의 글자를 미리 Map에 static 블록을 활용해서 저장했다. 이후 getStr 메서드에서 이미 저장된 숫자면 바로 반환하고 아니면 100 이상일 때 100의 자리까지 계산하고 십의 자리 수가 2보다 크면 십의 자리와 일의 자리 글자의 조합으로, 20보다 작으면 바로 Map에서 꺼내는 방식으로 구현했다.


3. 코드

 

import java.io.*;
import java.util.*;

public class Main {

    private static final Map<Integer, String> map = new HashMap<>();

    static {
        map.put(0, "");
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");
        map.put(4, "four");
        map.put(5, "five");
        map.put(6, "six");
        map.put(7, "seven");
        map.put(8, "eight");
        map.put(9, "nine");
        map.put(10, "ten");
        map.put(11, "eleven");
        map.put(12, "twelve");
        map.put(13, "thirteen");
        map.put(14, "fourteen");
        map.put(15, "fifteen");
        map.put(16, "sixteen");
        map.put(17, "seventeen");
        map.put(18, "eighteen");
        map.put(19, "nineteen");
        map.put(20, "twenty");
        map.put(30, "thirty");
        map.put(40, "forty");
        map.put(50, "fifty");
        map.put(60, "sixty");
        map.put(70, "seventy");
        map.put(80, "eighty");
        map.put(90, "ninety");
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        String[] input = new String[N];
        int len = -1;
        int pos = -1;

        for (int i = 0; i < N; i++) {
            input[i] = br.readLine();
            len += input[i].length();
            if (input[i].equals("$")) pos = i;
        }

        for (int i = 1; i < 1000; i++) {
            if (len + len(i) == i) {
                input[pos] = getStr(i);
                break;
            }
        }

        for (int i = 0; i < N; i++) {
            sb.append(input[i]).append(" ");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static String getStr(int num) {
        if (map.containsKey(num)) return map.get(num);

        StringBuilder sb = new StringBuilder();

        if (num >= 100) sb.append(map.get(num / 100)).append("hundred");

        if (num % 100 / 10 * 10 >= 20) sb.append(map.get(num % 100 / 10 * 10)).append(map.get(num % 10));
        else sb.append(map.get(num % 100));

        return sb.toString();
    }

    private static int len(int num) {
        return getStr(num).length();
    }

}

4. 후기