본문 바로가기
온라인저지

[BOJ] 2608번: 로마 숫자

by plzfday 2018. 7. 12.

2608번: 로마 숫자

어렵다고 생각했는데 어떻게 변수를 잘 저장하고 사용하느냐를 물어보는 듯한 문제였다.

token[][3] = {"IV", "XL", "CD", "M"};

이렇게 저장하는 게 핵심이었던 것 같다.

코드

#include <bits/stdc++.h>
using namespace std;

char s[11], token[][3] = {"IV", "XL", "CD", "M"}; // 4, 40, 400, 1000
int roman[90], ans = 0;
const int divs = 1000, zerocnt = 3;

int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(false);
    roman['I'] = 1,
    roman['V'] = 5,
    roman['X'] = 10,
    roman['L'] = 50,
    roman['C'] = 100,
    roman['D'] = 500,
    roman['M'] = 1000;

    for (int i = 2; i--;)
    {
        scanf("%s", s);
        for (int j = 0; s[j]; ++j)
            ans += (s[j + 1] && roman[s[j]] < roman[s[j + 1]] ? -roman[s[j]] : roman[s[j]]);
    }

    printf("%d\n", ans);

    for (int i = divs, j = zerocnt; i != 0; i /= 10, j--)
    {
        const int divbyI = ans / i;
        if (divbyI == 9)
            printf("%c%c", token[j][0], token[j + 1][0]);
        else if (divbyI == 4)
            printf("%c%c", token[j][0], token[j][1]);
        else if (divbyI >= 5)
        {
            putchar(token[j][1]);
            for (int k = 5; k < divbyI; ++k)
                putchar(token[j][0]);
        }
        else
        {
            for (int k = 0; k < divbyI; ++k)
                putchar(token[j][0]);
        }
        ans %= i;
    }
    return 0;
}

'온라인저지' 카테고리의 다른 글

[BOJ] 2609번: 최대공약수와 최소공배수  (0) 2018.07.13
[BOJ] 10800번: 컬러볼  (0) 2018.07.13
[BOJ] 2589번: 보물섬  (0) 2018.07.13
[BOJ] 2607번: 비슷한 단어  (0) 2018.07.12
[BOJ] 11048번: 이동하기  (0) 2018.06.04
[BOJ] 1932번: 정수 삼각형  (0) 2018.06.04

댓글