https://leetcode.com/problems/roman-to-integer
symbol 별로 숫자값이 할당 돼 있다.
처음 구상은 주어진 문자열 s를 char로 바꿔 하나씩 symbol을 확인해 가며 숫자로 변경하고 더하는 방식이었다.
하지만 문제에는 예외가 있었다. 큰 숫자에서 작은 숫자 순서로 나오는 로마 숫자이지만 작은 숫자 다음 큰 숫자가 나오면 뺄셈이 적용된다는 것이다.
예를 들어 문자열 s = “MCMXCIV”일 떄를 보자.
이는 [’M’, ‘C’, ‘M’, ‘X’, ‘C’, ‘I’, ‘V’] 로 바뀐다. 이를 숫자로 바꾸면 [1000, 100, 1000, 10, 100, 1, 5]가 된다.
이제 합을 누적 해 가야 한다. 단 다음 수보다 작은 수의 경우는 뺄 샘을 해준다.
1000 - 100 +1000 - 10 + 100 - 1 + 5 = 1994 가된다.
class Solution {
static Map<Character, Integer> symbolMap = new HashMap<>();
public int romanToInt(String s) {
int n = s.length();
if (n == 0) {
return 0;
}
int answer = 0;
init();
for (int i = 0; i < n - 1; i++) {
int symbolValue = symbolMap.get(s.charAt(i));
int nextSymbolValue = symbolMap.get(s.charAt(i + 1));
if (symbolValue < nextSymbolValue) {
answer -= symbolValue;
} else {
answer += symbolValue;
}
}
return answer + symbolMap.get(s.charAt(n - 1));
}
private void init() {
symbolMap.put('I', 1);
symbolMap.put('V', 5);
symbolMap.put('X', 10);
symbolMap.put('L', 50);
symbolMap.put('C', 100);
symbolMap.put('D', 500);
symbolMap.put('M', 1000);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 151 - Reverse Words in a String (1) | 2024.10.03 |
---|---|
LeetCode 12 - Integer to Roman (0) | 2024.10.03 |
LeetCode 42 - Trapping Rain Water (0) | 2024.10.02 |
LeetCode 150 - Candy (1) | 2024.09.30 |
LeetCode 134 - Gas Station (1) | 2024.09.29 |