BOJ_1755_숫자놀이_JAVA
문제 : 숫자놀이
링크 : BOJ_1755_숫자놀이
접근 방식
M~N까지의 숫자를 숫자 단위로 하나씩 영어로 변환시킨다.
변환시킨 후 만들어진 문자열 배열을 사전순으로 정렬시킨다.
사전순으로 정렬이 완료되면 문자열을 다시 숫자로 변환하여 출력한다.
10개 단위로 줄바꿈을 해주는 것을 잊지 말자.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.StringTokenizer;
public class BOJ_1755_숫자놀이 {
public static void main(String[] args) throws IOException {
// 입력값 받기
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
// 숫자 -> 문자열로 바꿀 문자열 배열
String[] numToStr = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
// 첫 번째 숫자
int M = Integer.parseInt(st.nextToken());
// 두 번째 숫자
int N = Integer.parseInt(st.nextToken());
// 문자열 리스트 저장할 변수
ArrayList<String> list = new ArrayList<>();
// 첫 번째 숫자부터 2번째 숫자까지 반복
for(int i=M;i<=N;i++) {
// 2자리 숫자 각각 나누기
int num1 = i / 10;
int num2 = i % 10;
// 10의 자리수 문자열 변수
String str1 = "";
// 10의 자리수가 0이 아닐때만
if(num1 != 0) {
// 문자열 추가
str1 = numToStr[num1];
}
// 1의 자리 수 문자열 추가
String str2 = numToStr[num2];
if(str1 == "") {
list.add(str2);
}else {
list.add(str1+" "+str2);
}
}
System.out.println(list);
// 정렬 - 사전순
Collections.sort(list);
// 출력부
for(int i=0,n=list.size();i<n;i++) {
// 리스트에서 문자열을 꺼내기
st = new StringTokenizer(list.get(i));
// 첫 번째 수
int num1 = 0;
// 첫 번째 문자열 가져오기
String str1 = st.nextToken();
// 배열을 탐색하여 같은 문자열의 index num1에 저장
for(int j=0;j<10;j++) {
if(str1.equals(numToStr[j])) {
num1 = j;
break;
}
}
// num1 출력
System.out.print(num1);
// 두 번째 수
int num2 = 0;
// 다음 토큰이 남아있다면
if(st.hasMoreTokens()) {
// 두 번째 문자열 가져오기
String str2 = st.nextToken();
// 배열을 탐색하여 같은 문자열의 index num2에 저장
for(int j=0;j<10;j++) {
if(str2.equals(numToStr[j])) {
num2 = j;
break;
}
}
// num2 출력
System.out.print(num2);
}
// 10번째 끊기
if(i%10 == 9) {
System.out.println();
}else {
System.out.print(" ");
}
}
}
}
중간에 채점 결과가 계속 틀렸는데, 그 이유가 문자열로 만든 뒤에 한 자리 수의 문자열에는 앞에 공백문자가 들어가 있어 정렬할 때 우선으로 배치되었기 때문이었다. 1, 2자리수 각각의 문자가 공백 없이 배치되도록 하는 주의가 필요한 문제였다.