문제 : 로마 문자의 문자열을 숫자로 변환하기
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
Example 1:
Input: s = "III" Output: 3
Example 2:
Input: s = "IV" Output: 4
Example 3:
Input: s = "IX" Output: 9
Example 4:
Input: s = "LVIII" Output: 58 Explanation: L = 50, V= 5, III = 3.
Example 5:
Input: s = "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
조건
1 <= s.length <= 15
s는 ('I', 'V', 'X', 'L', 'C', 'D', 'M')의 문자만 포함
변환한 숫자의 합은 1 ~ 3999의 범위를 보장함.
문제 접근
문자열을 문자 배열로
문자 배열을 숫자로 치환
class Solution {
public int romanToInt(String s) {
int sumValue = 0;
int[] numberArr = new int[s.length()];
char[] romancharArr = s.toCharArray();
for(int i = 0; i < romancharArr.length; i++) {
switch(romancharArr[i]) {
case 'M':
numberArr[i] = 1000;
break;
case 'D':
numberArr[i] = 500;
break;
case 'C':
numberArr[i] = 100;
break;
case 'L':
numberArr[i] = 50;
break;
case 'X':
numberArr[i] = 10;
break;
case 'V':
numberArr[i] = 5;
break;
case 'I':
numberArr[i] = 1;
break;
}
}
for(int num : numberArr)
{
sumValue += num;
}
return sumValue;
}
}
-> IV = 6이 아닌 4같은 예외 케이스를 처리할 수 없음.
그렇다면? 규칙성이 있을 것이다.
IV = 6이 아닌 4, CM -> 1100이 아닌 900, XC -> 110이 아닌 90
-> V - I, M - C, C - X 같은 엮인 두 수를 큰수 - 작은수로 만들어야 한다.
MCMXCIV -> MMCCXVI가 원래 맞는 순서? ->
가장 큰 숫자 부터 돌면서 임시 변수에 넣어두고 그 다음수와 대조하여 그 보다 작은 수 일 경우
그 수를 빼면 되지 않을까
class Solution {
public int romanToInt(String s) {
int sumValue = 0;
int beforeValue = 0;
int[] numberArr = new int[s.length()];
char[] romancharArr = s.toCharArray();
for(int i = 0; i < romancharArr.length; i++) {
switch(romancharArr[i]) {
case 'M':
numberArr[i] = 1000;
break;
case 'D':
numberArr[i] = 500;
break;
case 'C':
numberArr[i] = 100;
break;
case 'L':
numberArr[i] = 50;
break;
case 'X':
numberArr[i] = 10;
break;
case 'V':
numberArr[i] = 5;
break;
case 'I':
numberArr[i] = 1;
break;
}
}
for(int i = numberArr.length-1; i >= 0; i--) {
if(numberArr[i] < beforeValue) {
sumValue -= numberArr[i];
}
else {
sumValue += numberArr[i];
beforeValue = numberArr[i];
}
}
return sumValue;
}
}
Runtime: 3 ms, faster than 99.91% of Java online submissions for Roman to Integer.
Memory Usage: 38.8 MB, less than 93.85% of Java online submissions for Roman to Integer.
배고프다...
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode] Two Sum (0) | 2021.03.16 |
---|---|
[LeetCode] Top K Frequent Elements (0) | 2021.03.15 |
[LeetCode] Path Sum Debuging (0) | 2021.03.11 |
[LeetCode] Path Sum (0) | 2021.03.11 |
[LeetCode] Binary Tree Inorder TraversalSolution (0) | 2021.03.10 |