[LeetCode, 리트코드] Roman to Integer
- 카테고리 없음
- 2018. 11. 21. 18:25
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; } };
이 글을 공유하기