문제링크
https://leetcode.com/problems/roman-to-integer/
문제정보
로마자로 구성된 문자열 s가 매개변수로 주어집니다.
각 로마자에 대응되는 value를 기반으로 로마자를 정수로 변환하여 리턴합니다.
로마자는 큰것에서 작은것 순으로 표기하지만
작은수가 큰수보다 앞에 있는 경우 작은수는 뺄셈으로 작용합니다.
ex : IV = 5 - 1 = 4
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
example
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
나의풀이
var romanToInt = function(s) {
let symbols = {
"I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000
};
value = 0;
for(let i = 0; i < s.length; i++){
symbols[s[i]] < symbols[s[i+1]] ? value -= symbols[s[i]]: value += symbols[s[i]]
}
return value
};
조건
1. 작은밸류의 symbol이 큰밸류의 symbol 앞에 있는 경우를 고려해야합니다.
2. 답은 정수형태로 반환되어야합니다.
풀이방법
1. 객체를 이용한 해시테이블을 기반으로 문제를 풉니다.
2. 삼항연산자를 이용해 작은 symbol이 큰 symbol 앞에 있는 경우를 처리합니다.
특이사항
1. index가 length값보다 큰 경우는 undefined가 리턴됩니다.
간단하게 더하기만 해주면 될 것 같은 문제입니다만
작은밸류를 가지는 로마자가 큰밸류를 가지는 로마자의 앞에 오면 뺄셈으로 작용시켜야한다는 점을 고려해야했네요
const romanToInt = s => {
if (!s || s.length === 0) {
return 0;
}
const map = new Map([['I', 1], ['V', 5], ['X', 10], ['L', 50], ['C', 100], ['D', 500], ['M', 1000]]);
let i = s.length - 1;
let result = map.get(s[i]);
while (i > 0) {
const curr = map.get(s[i]);
const prev = map.get(s[i - 1]);
if (prev >= curr) {
result += prev;
} else {
result -= prev;
}
i--;
}
return result;
};
저처럼 객체를 선언해서 푸는게 아니라 Map을 선언해서 푸는 솔루션입니다.
이것도 흥미롭네요
'leetcode' 카테고리의 다른 글
409. Longest Palindrome 자바스크립트 (0) | 2022.12.19 |
---|---|
66.plus One (0) | 2022.11.29 |
500. Keyboard Row (0) | 2022.11.27 |
231. Power of Two (0) | 2022.11.26 |
34. Find First and Last Position of Element in Sorted Array Medium (0) | 2022.11.25 |