LeetCode #12. Integer to Roman プログラミング練習

問題:

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: 3
Output: "III"
Example 2:

Input: 4
Output: "IV"
Example 3:

Input: 9
Output: "IX"
Example 4:

Input: 58
Output: "LVIII"
Explanation: C = 100, L = 50, XXX = 30 and III = 3.
Example 5:

Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

難易度: medium
入力: int
目的: 入力された整数をローマ数字に変換せよ
出力: String

数字をローマ数字に変換する問題です。
日本人に馴染みがあるのは大体Xまでで、
Lからのローマ数字はあまり見かけたことがないですね。
問題記述にある通り、
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
になります。
表し方は、大きい数字を中心に、左側はマイナス、右側はプラスです。
例えば
VIは5+1でIVは5-1です。
大きな数字も同様で、
MCは1100で、
CMは900です。
最初はIとVを分けて書いたのですが(VI = 5+1という考え方)
VIやIV等の処理で分岐が多くなってしまい、
結局は纏めて分岐なしで書くことにしました。
コード自体は簡単ですが、
日系IT企業でも数字を他の形式に変換(8進数に変換、英語表記に変換)する問題が多いので
基本的な考え方は覚えておきましょう。

注意すべき事: 

  • ローマ数字にはLやDの様な、5の倍数の単位がありますが、それを単独に処理するよりは纏めて10の倍数を一つの単位として処理するのが楽です。


以下回答です。

class Solution {
    public String intToRoman(int num) {
        String M[] = {"", "M", "MM", "MMM"};
        String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
        String res = "";
        res += M[num/1000];
        res += C[(num%1000)/100];
        res += X[(num%100)/10];
        res += I[num%10];
        return res;
    }
}

数字の処理さえ間違わなければ簡単に処理できる問題ですね。
入力が最大で3999なのでMは3000までしか書いていません。
時間のある人は整数じゃない場合、小数はどう処理すればいいのか考えてみるのもいいですね。

では!