작성일 :

문제 링크

1755번 - 숫자놀이

설명

두 정수 M, N이 주어졌을 때,

M 이상 N 이하의 모든 정수를 영어로 읽은 뒤, 해당 영어 표현을 기준으로 사전순 정렬하여 출력하는 문제입니다.


예를 들어, 숫자 79"seven nine", 숫자 80"eight zero"로 읽습니다.

이때 "eight zero""seven nine"보다 사전순으로 앞에 있으므로 숫자 8079보다 먼저 출력되어야합니다.


접근법

  • 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;
}