/ BOJ

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자리수 각각의 문자가 공백 없이 배치되도록 하는 주의가 필요한 문제였다.