백준 1755 - 숫자 놀이

Updated:

Java

1755 번 - 숫자 놀이

문제

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

문제는 정수 M, N(1 ≤ M, N ≤ 99)이 주어지면 M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.

접근 방법

입력 받는 숫자를 문자열로 바꾸고, Sort 알고리즘을 이용해 String을 비교, 정렬한다.

코드

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

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		
		ArrayList<Integer> arr = new ArrayList<>();
		// 주어진 입력을 받아 List에 저장한다.
		for(int i = m; i <= n; i++) {
			arr.add(i);
		}
		// Sort 알고리즘을 사용하되, 정렬 방법을 조정한다.
		Collections.sort(arr, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				String first = convert(o1);		// 첫번째 인자를 문자열로 변경
				String sec = convert(o2);		// 두번째 인자를 문자열로 변경
				int result = first.compareTo(sec);	// 문자열 비교 -> 사전 순으로 비교된다.
				return result;
			}
		});
		// 출력
		int idx = 1;
		for(int val : arr) {
			System.out.print(val + " ");
			if(idx++ % 10 == 0)
				System.out.println();
		}
		
		sc.close();
	}
	// 숫자를 문자열로 변환하는 메서드
	static String convert(int i) {
		StringBuilder str = new StringBuilder();
		// 10보다 작으면 1의 자리 수므로, 바로 문자열로 변경
		if(i < 10) {
			str.append(toNumStr(i));
		}
		// 10보다 크면, 해당 숫자 i를 10으로 나누면 10의 자리수, 10으로 modulo하면 1의 자리수가 된다.
		// 따라서 각 숫자를 분리함
		else {
			str.append(toNumStr(i / 10)).append(" ").append(toNumStr(i % 10));
		}
		
		return str.toString();
	}
	// 분리 된 숫자를 입력 받아 해당하는 문자열로 변환해주는 메서드
	static String toNumStr(int i) {
		switch(i) {
		case 0:
			return "zero";
		case 1:
			return "one";
		case 2:
			return "two";
		case 3:
			return "three";
		case 4:
			return "four";
		case 5:
			return "five";
		case 6:
			return "six";
		case 7:
			return "seven";
		case 8:
			return "eight";
		case 9:
			return "nine";
		}
		return "";
	}
}

총평

후기

개선할 점

없습니다.