반응형

[LeetCode, 리트코드] Roman to Integer

반응형

1. Problem


로만 표기법은 7가지 다른 심볼로 나타내어 진다. I, V, X, L, C, D, M

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

예를들어 II 일 때는 1을 두 번 더한 것과 같다. 12이 일 때는 XII, X + II 를 더한 것을 의미한다. XXVVII는 XX + V + II를 더한 것을 의미한다.

 

로만 표기법은 왼쪽부터 오른쪽으로 큰 수에서 작은 수로 표기되어 진다. 그리고 여기서 4는 IIII로 나타내어 지지 않고 IV로 나타내어진다. 왜냐하면 4는 5바로 직전의 수 이므로 V에서 I를 빼면 된다는 의미이다. IV가 바로 그 뜻이다. 이런 규칙은 총 6가지의 경우가 있다.

 

IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900

 

주어진 정수에 대해 이것을 로만표기법으로 고치는 함수를 작성하라. 입력은 1에서부터 3999까지다.

 

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 5:

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

 

2. Solution


IV, XC 같은 크기가 2인 심볼을 먼저 체크해 주면서 문자열을 순회하면 됨.

3. What I solved

class Solution { public: int romanToInt(string s) { map<string, int> symbolToUnit; symbolToUnit["M"] = 1000; symbolToUnit["CM"] = 900; symbolToUnit["D"] = 500; symbolToUnit["CD"] = 400; symbolToUnit["C"] = 100; symbolToUnit["XC"] = 90; symbolToUnit["L"] = 50; symbolToUnit["XL"] = 40; symbolToUnit["X"] = 10; symbolToUnit["IX"] = 9; symbolToUnit["V"] = 5; symbolToUnit["IV"] = 4; symbolToUnit["I"] = 1; string symbol; int ret = 0; for(int i=0; i<s.size(); ){ if(i <= s.size() - 2){ symbol = s.substr(i, 2); cout << symbol << endl; if(symbolToUnit.find(symbol) != symbolToUnit.end()){ ret += symbolToUnit[symbol]; i += 2; continue; } } symbol = s[i]; ret += symbolToUnit[symbol]; ++i; } return ret; } };



반응형

이 글을 공유하기

댓글

Designed by JB FACTORY