PS/BOJ
백준 1755번: 숫자놀이 (C++)
도비(Doby)
2023. 3. 1. 11:11
https://www.acmicpc.net/problem/1755
1755번: 숫자놀이
79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로
www.acmicpc.net
Level: Silver IV
Solved By: String
M과 N 사이의 수들을 문자열로 변환하는 작업을 하고, 이를 정렬하여 출력해 주면 되는 문제입니다.
하지만, 이를 출력할 때는 문자열로 바뀐 숫자가 무엇이었는지 기억해야 하기에 pair<int, string>을 사용하여 second의 기준으로 정렬하고, first를 출력해 주었습니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int M, N;
vector<pair<int, string>> v;
map<string, int> m;
bool cmp(pair<int, string> a, pair<int, string> b){
return a.second < b.second;
}
string getNum(int n){
if(n == 0) return "zero";
else if(n == 1) return "one";
else if(n == 2) return "two";
else if(n == 3) return "three";
else if(n == 4) return "four";
else if(n == 5) return "five";
else if(n == 6) return "six";
else if(n == 7) return "seven";
else if(n == 8) return "eight";
else return "nine";
}
int main(){
cin >> M >> N;
for(int i = M; i <= N; i++){
if(i / 10){ // 10의 자리
int a = i / 10; int b = i % 10;
v.push_back({i, getNum(a) + ' ' + getNum(b)});
}
else{ // 1의 자리
v.push_back({i, getNum(i)});
}
}
sort(v.begin(), v.end(), cmp);
int f = 1;
for(int i = 0; i < v.size(); i++){
cout << v[i].first << ' ';
if(f % 10 == 0) cout << '\n';
f++;
}
}