알고리즘/문자열

[BOJ] 백준 1755 - 숫자놀이 풀이

송승현(SSH) 2022. 10. 4. 23:58

1. 문제

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

 

1755번: 숫자놀이

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

www.acmicpc.net

 

2. 풀이

문자열 문제이다.
우선 0부터 9까지의 수를 영어로 배열에 저장하고(numArr), 입력으로 주어지는 M부터 N까지 반복문을 돈다.
반복문을 돌 때 반복문의 인덱스를 문자열화 시키고, 그 문자열을 하나씩 또 탐색하면서 아까 저장해둔 numArr의 인덱스에 맞는 값을 가져와서 영문화시키고, list에 넣는다.

그 후 리스트를 오름차순으로 정렬하고, 리스트에서 하나씩 꺼내어 숫자화 시켜주고 출력하면 답!!

 

3. 소스코드

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

public class Main {

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

        String[] numArr = {"zero", "one", "two", "three", "four", "five", "six",
                "seven", "eight", "nine"};

        StringTokenizer st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        ArrayList<String> list = new ArrayList<>();
        for (int i = M; i <= N; i++) {
            String integerToString = Integer.toString(i);
            StringBuffer sb = new StringBuffer();

            for (int j = 0; j < integerToString.length(); j++) {
                char c = integerToString.charAt(j);
                sb.append(numArr[c - '0'] + " ");
            }
            list.add(sb.toString());
        }

        Collections.sort(list);

        int cnt = 0;

        for (String s : list) {
            String[] split = s.split(" ");

            int result = 0;
            int k = 1;

            for (int i = split.length - 1; i >= 0; i--) {
                result += Arrays.asList(numArr).indexOf(split[i]) * k;
                k *= 10;
            }

            if (cnt == 10) {
                bw.write("\n");
                cnt = 0;
            }
            bw.write(Integer.toString(result) + " ");
            cnt += 1;
        }

        bw.flush();
        bw.close();
        br.close();
    }
}