백준 13273 로마숫자 (C++)

안유태·2023년 7월 11일
0

알고리즘

목록 보기
108/239

13273번: 로마숫자

문자열을 활용한 구현문제이다. 숫자로 주어질 경우와 문자열로 주어질 경우 두가지 경우가 있다. 두가지 경우를 나누어 알고리즘을 작성하였다. 먼저 숫자의 경우 자릿수만큼 반복문을 돌며 비교하여 각각 해당하는 문자를 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;
}
profile
공부하는 개발자

0개의 댓글