BOJ 1755 숫자놀이
BOJ 1755 숫자놀이
https://www.acmicpc.net/problem/1755
문제
79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 “seven nine”이 된다. 80은 마찬가지로 “eight zero”라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 “eight zero”가 “seven nine”보다 사전순으로 먼저 온다.
문제는 정수 M, N(1 ≤ M ≤ N ≤ 99)이 주어지면 M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.
입력
첫째 줄에 M과 N이 주어진다.
출력
M 이상 N 이하의 정수를 문제 조건에 맞게 정렬하여 한 줄에 10개씩 출력한다.
예제 입력 1
8 28
예제 출력 1
8 9 18 15 14 19 11 17 16 13 12 10 28 25 24 21 27 26 23 22 20
코드
간단한 문제였다.
나는 각 숫자에 대응하는 영어 단어 배열을 정의하고, 이를 활용해 숫자들을 문자열로 바꾸어 오름차순으로 출력했다.
직접 각 숫자에 대응하는 영어 단어 배열을 정의하는 대신, 각 숫자를 영어로 바꿨을 때의 순위를 미리 계산해서 int 기준으로 비교하는 것이 가독성 측면으로는 별로 좋진 않겠지만, 더 빠를 것 같긴 하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static class NumberAndEnglish {
int number;
String english;
public NumberAndEnglish(int number) {
this.number = number;
initializeEnglish(number);
}
private void initializeEnglish(int number) {
StringBuilder english = new StringBuilder();
english.append(NUMBERS_IN_ENGLISH[number % 10]);
number /= 10;
while (number > 0) {
english.insert(0, ' ');
english.insert(0, NUMBERS_IN_ENGLISH[number % 10]);
number /= 10;
}
this.english = english.toString();
}
}
static final String[] NUMBERS_IN_ENGLISH = {
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
PriorityQueue<NumberAndEnglish> queue = new PriorityQueue<>(
Comparator.comparing(ne -> ne.english)
);
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
for (; start <= end; start++) {
queue.offer(new NumberAndEnglish(start));
}
StringBuilder answer = new StringBuilder();
while (!queue.isEmpty()) {
int boundary = Integer.min(10, queue.size());
for (int i = 0; i < boundary; i++) {
answer.append(queue.poll().number).append(' ');
}
answer.append('\n');
}
System.out.println(answer);
}
}
This post is licensed under CC BY 4.0 by the author.