본문 바로가기

문제 풀이/Baekjoon

[백준] S4 1755번 숫자놀이 (JAVA)

문제 출처 - Baekjoon Online Judge

문제는 여기

 

1755번: 숫자놀이

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

www.acmicpc.net

[문제] 

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. 숫자를 영어로 변경했을 때, 사전순으로 나열한 결과를 배열로 받아준다.

2. 입력받은 숫자에 해당하는 2차원 배열의 좌표를 증가시켜준다.

3. 2차원 배열을 반복시키면서 사전순으로 나열한 배열의 값과 비교하여 1이면 출력한다.

[접근]

1. 숫자 > 영어, 영어 > 숫자로 바꾸면 시간 초과가 나지 않을까?라고 생각 (1~99의 숫자라서 시간 초과 안남...)

2. 2차원의 배열을 사용해 행 * 10 + 열의 값과 입력받은 숫자를 매칭시켜 준다.

3. 사전순으로 나열한 배열의 i번째에 해당하는 값이 있으면 출력시킨다.

4. count를 사용해 10개의 숫자를 출력했다면 줄 바꿈을 한다.

[코드]

package BOJ_silver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/*
 * zero
 * one
 * two
 * three
 * four
 * five
 * six
 * seven
 * eight
 * nine
 * 
 * 8 5 4 9 1 7 6 3 2 0 순서
 */


public class Main_S4_1755 {
	static int n;
	static int m;
	static int[][] sort; // 해당하는 자리에 입력받은 숫자를 매핑시키기 위한 2차원 배열
	static int[] arr; // 처음 숫자를 입력받는 배열(막상 하고 보니 필요가 없음)
	static int[] line = {8, 5, 4, 9, 1, 7, 6, 3, 2, 0}; // 사전순으로 나열한 배열
	static int count;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		m = Integer.parseInt(st.nextToken());
		n = Integer.parseInt(st.nextToken());
		
		arr = new int[101];
		sort = new int[10][10];
		
        // 2차원 배열에 값을 매핑시켜주기
		for (int i = m; i <= n; i++) {
			int k = arr[i] = i;
			
			if (arr[i] < 10) {
				sort[0][i]++;
			}
			else {
				int num = arr[i] % 10;
				k = arr[i] / 10;
				int mod = k % 10;
				sort[mod][num]++;
			}
		}
		
		for (int i = 0; i < 9; i++) {
			if (sort[0][line[i]] == 1) { // 1의 자리에 해당하는 값부터 출력
				System.out.print(line[i] + " ");
				count++;
				if (count % 10 == 0)
					System.out.println();
			}
			for (int j = 0; j < 10; j++) {
				if (sort[line[i]][line[j]] == 1) { // 순서에 맞게 나온다면
					System.out.print(line[i] * 10 + line[j] + " "); // 값 출력
					count++; // 카운트 증가
					if (count % 10 == 0)
						System.out.println();
				}
			}
		}
	}
}