[백준 1755] 숫자놀이 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 정수 M
, N
이 주어졌을 때,
M
이상 N
이하의 모든 정수를 영어로 읽은 뒤, 해당 영어 표현을 기준으로 사전순 정렬하여 출력하는 문제입니다.
예를 들어, 숫자 79
는 "seven nine"
, 숫자 80
은 "eight zero"
로 읽습니다.
이때 "eight zero"
가 "seven nine"
보다 사전순으로 앞에 있으므로 숫자 80
이 79
보다 먼저 출력되어야합니다.
접근법
0
부터9
까지의 숫자를 영어 단어로 변환할 수 있는 영어 대응 배열을 준비합니다.- 입력 받은 구간
[M, N]
의 각 숫자를 순회하면서:- 각 자릿수를 영어로 변환한 문자열을 생성합니다.
- 이 문자열과 해당 숫자를 쌍으로 저장합니다.
- 문자열을 기준으로 사전순 정렬한 뒤 정렬된 순서에 따라 원래 숫자를 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
class Program {
static void Main() {
var eng = new[] {
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"
};
var tokens = Console.ReadLine().Split().Select(int.Parse).ToArray();
int m = tokens[0], n = tokens[1];
var list = new List<(string word, int num)>();
for (int i = m; i <= n; i++) {
var word = string.Join("", i.ToString().Select(c => eng[c - '0']));
list.Add((word, i));
}
list.Sort();
for (int i = 0; i < list.Count; i++) {
Console.Write(list[i].num);
Console.Write((i % 10 == 9 || i == list.Count - 1) ? "\n" : " ");
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
typedef pair<string, int> psi;
typedef vector<psi> vpsi;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string eng[] = {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
int a, b; cin >> a >> b;
vpsi v;
for (int i = a; i <= b; i++) {
string s;
for (char c : to_string(i))
s += eng[c - '0'];
v.push_back({s, i});
}
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++)
cout << v[i].second << (i % 10 == 9 || i == v.size() - 1 ? "\n" : " ");
return 0;
}