작성일 :

문제 링크

26198번 - Chronogram

설명

문자열에 포함된 로마 숫자 문자의 값을 모두 더해 연도를 구하는 문제입니다.

사용되는 문자는 I, V, X, L, C, D, M이며 각각 1, 5, 10, 50, 100, 500, 1000의 값을 가집니다.


접근법

각 문자를 순회하며 로마 숫자에 해당하는 문자면 그 값을 합산합니다. 로마 숫자가 아닌 문자는 0으로 처리하여 무시합니다.

일반적인 로마 숫자 변환과 달리 뺄셈 규칙(IV=4 등)을 적용하지 않고, 각 문자의 값을 단순히 더하기만 하면 됩니다.


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
using System;

class Program {
  static int Val(char c) => c switch {
    'I' => 1,
    'V' => 5,
    'X' => 10,
    'L' => 50,
    'C' => 100,
    'D' => 500,
    'M' => 1000,
    _ => 0
  };

  static void Main() {
    var t = int.Parse(Console.ReadLine()!);
    for (var tc = 0; tc < t; tc++) {
      var line = Console.ReadLine()!;
      var sum = 0;
      foreach (var ch in line)
        sum += Val(ch);
      Console.WriteLine(sum);
    }
  }
}

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
30
31
32
33
#include <bits/stdc++.h>
using namespace std;

int val(char c) {
  switch (c) {
    case 'I': return 1;
    case 'V': return 5;
    case 'X': return 10;
    case 'L': return 50;
    case 'C': return 100;
    case 'D': return 500;
    case 'M': return 1000;
    default: return 0;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int t; cin >> t;
  cin.ignore();

  for (int tc = 0; tc < t; tc++) {
    string line;
    getline(cin, line);
    int sum = 0;
    for (char c : line) sum += val(c);
    cout << sum << "\n";
  }

  return 0;
}