반응형
문제
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.
해당 문자에 해당하는 숫자를 더하거나 빼면 된다.
기본적으로 왼쪽에서 오른쪽 방향으로 큰 숫자(왼쪽) -> 작은 숫자(오른쪽) 순서대로 구성된다.
하지만, 숫자 4 또는 9를 다루는 경우 해당 규칙이 적용되지 않는다.
4 또는 9의 경우 오른쪽 -> 왼쪽 방향으로 숫자를 빼는 방식이다.
예시)
4 = IV, 9 = IX / 40 = XL, 90 = XC / 400 = CD, 900 = CM
구현 시 I, X, C 뒤에 나오는 문자가 해당 문자보다 크기가 크다면 더하지 말고 빼도록 구현해야 한다.
제약조건
- 1 <= s.length <= 15 (문자의 길이는 1 이상 15 이하로 제한)
- s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M'). ('I', 'V', 'X', 'L', 'C', 'D', 'M' 문자만 사용하도록 제한)
- It is guaranteed that s is a valid roman numeral in the range [1, 3999]. (결과값은 4000미만 정수가 되도록)
답안
class Solution {
public int romanToInt(String s) {
Step.01)
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
Step.02)
char[] charArr = s.toCharArray();
int result = 0, i = 0, j = 1;
Step.03)
for(; j < charArr.length; i++, j++){
if(map.get(charArr[i]) >= map.get(charArr[j])){
result += map.get(charArr[i]);
}else{
result -= map.get(charArr[i]);
}
}
Step.04)
result += map.get(charArr[i]);
return result;
}
}
Step.01)
- key, value 한 쌍으로 이루어진 자료형 map을 사용해 로마자에 해당하는 정수를 입력한다.
Step.02)
- toCharArray를 통해 문자열을 char형 배열 형태로 만든다. 배열의 길이는 문자열의 길이와 같다.
- 문자열 공백도 인덱스에 포함되기 때문에 주의해야 한다.
- 만약 변수 s의 값이 "IV"라면, charArr["I", "V"] 이런 형태의 배열이 만들어지는 것이다.
Step.03)
- Step.02에서 만든 charArr 배열의 길이만큼 반복 -> map에서 value값 가져와서 비교한다.
Step.04)
- 변수 result에 결과값을 더한다.
반응형
'Programming > 알고리즘 공부' 카테고리의 다른 글
[LeetCode] Remove Duplicates from Sorted Array | 난이도: Easy (0) | 2021.08.12 |
---|---|
[LeetCode] Longest Common Prefix | 난이도: Easy (0) | 2021.08.10 |
[LeetCode] Palindrome Number | 난이도: Easy (0) | 2021.08.06 |
[LeetCode] Reverse Integer | 난이도: Easy (0) | 2021.08.06 |
[LeetCode] Two Sum | 난이도: Easy (0) | 2021.08.05 |