본문 바로가기

백준/C++

[Baekjoon/C++] 1755번 - 숫자놀이

[백준] Baekjoon Online Judge

문제로 이동

 

문제

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개씩 출력한다.

 


예제 입력 예제 출력
8 28 8 9 18 15 14 19 11 17 16 13
12 10 28 25 24 21 27 26 23 22
20

풀이

#include <iostream>
#include <algorithm>
using namespace std;

string num[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int arr[100];

string chgString(int n);
bool compare(int a, int b);

// 숫자를 문자열로
string chgString(int n) {
	string s;

	if (n < 10)
		s = num[n];
	else
		s = num[n / 10] + " " + num[n % 10];

	return s;
}

// 정렬
bool compare(int a, int b) {
	string s1 = chgString(a);
	string s2 = chgString(b);

	return s1 < s2;
}

int main() {
	int M, N;
	scanf("%d %d", &M, &N);

	int idx = N - M + 1;

	for (int i = 0; i < idx; i++)
		arr[i] = M + i;

	sort(arr, arr + idx, compare);

	// 한 줄에 10개씩 출력
	for (int i = 0; i < idx; i++) {
		printf("%d ", arr[i]);

		if ((i + 1) % 10 == 0) printf("\n");
	}

	return 0;
}

 

string num[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int arr[100];

// 숫자를 문자열로
string chgString(int n) {
	string s;

	if (n < 10)
		s = num[n];
	else
		s = num[n / 10] + " " + num[n % 10];

	return s;
}

// 정렬
bool compare(int a, int b) {
	string s1 = chgString(a);
	string s2 = chgString(b);

	return s1 < s2;
}

해당 문제는 숫자를 문자열로 바꾸는 과정이 필요하다. 그렇기에 각 숫자별 변환해야 하는 문자열을 num에 저장한 뒤 숫자를 문자열로 바꾸는 chgString()을 구현했다. 그리고 이렇게 변환한 문자열을 정렬하기 위해 compare함수 또한 구현했다.