문자열을 활용한 구현문제이다. 숫자로 주어질 경우와 문자열로 주어질 경우 두가지 경우가 있다. 두가지 경우를 나누어 알고리즘을 작성하였다. 먼저 숫자의 경우 자릿수만큼 반복문을 돌며 비교하여 각각 해당하는 문자를 result
에 넣어주었다. 만약 4 또는 9 일 경우 각 자릿수 중 앞자리가 1에 해당하는 문자를 먼저 넣고 다음 자릿수중 앞자리가 1인 문자를 넣어주었다. 문자열의 경우 크기만큼 반복문을 돌며 I, X, C 이고 다음 자릿수가 a[j+1]
또는 a[j+2]
에 해당할 경우 두 값의 차를 구해 result
에 더해주고 i++
를 해주었다. 솔직히 범위가 적어서 완전 노가다로 구현을 해도 금방할 수 있을것 같은 문제이다. 어렵지 않게 풀 수 있었다.
#include <iostream>
#include <cmath>
using namespace std;
string num;
int n[7] = { 1,5,10,50,100,500,1000 };
char a[7] = { 'I','V','X','L','C','D','M' };
void solution1() {
string result = "";
for (int i = 0; i < num.size(); i++) {
int now = (num[i] - '0') * pow(10, (num.size() - i - 1));
for (int j = 0; j < 6; j++) {
if (now >= n[j] && now < n[j + 1]) {
if (num[i] == '4') {
result.push_back(a[j]);
result.push_back(a[j + 1]);
}
else if (num[i] == '9') {
result.push_back(a[j - 1]);
result.push_back(a[j + 1]);
}
else if (num[i] < '4') {
for (int k = 0; k < num[i] - '0'; k++) {
result.push_back(a[j]);
}
}
else if (num[i] >= '5') {
result.push_back(a[j]);
for (int k = 0; k < num[i] - '5'; k++) {
result.push_back(a[j - 1]);
}
}
}
}
if (now >= n[6]) {
for (int k = 0; k < num[i] - '0'; k++) {
result.push_back(a[6]);
}
}
}
cout << result << endl;
}
void solution2() {
int result = 0;
for (int i = 0; i < num.size(); i++) {
for (int j = 0; j < 7; j++) {
if (num[i] == a[j]) {
if (i != num.size() - 1 && (num[i] == 'I' || num[i] == 'X' || num[i] == 'C')) {
if (num[i + 1] == a[j + 1]) {
int now = n[j + 1] - n[j];
result += now;
i++;
}
else if (num[i + 1] == a[j + 2]) {
int now = n[j + 2] - n[j];
result += now;
i++;
}
else {
result += n[j];
}
}
else {
result += n[j];
}
break;
}
}
}
cout << result << endl;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int T;
cin >> T;
while (T--) {
cin >> num;
if (num[0] >= '0' && num[0] <= '9') {
solution1();
}
else {
solution2();
}
}
return 0;
}