roma 알파벳이 입력되면 해당 알파벳에 맞는 값을 리턴하는 문제이다.
roma알파벳 = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };
Input: s = "MCMXCIV"
Output: 1994
romaPlus 객체를 선언하여 검사 i번째 요소와 i + 1번째 요소를 조합하여 체크한다.
romaPlus 객체에 key 가 있다면 해당 값을 result에 더하고 i++ 를 해준다.
없다면 기본 roma알파벳 객체에서 값을 찾아 result 에 더해준다.
var romanToInt = function (s) {
const roma = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };
let result = 0;
for (let i = 0; i <= s.length - 1; i++) {
const current = s[i];
const second = s[i + 1];
const romaPlus = { IV: 4, IX: 9, XL: 40, XC: 90, CD: 400, CM: 900 };
const te = romaPlus[current + second];
if (te) {
result += te;
i++;
} else {
result += roma[current];
}
}
return result;
};
다른 사람의 풀이를 보니 이 방식이 runtime 도 적고 간단하여 적어본다.
현재값과 다음 값을 비교하여 현재값이 더 작다면 second - current를 result 에 더하고 i++을 해준다.
current 가 더 크다면 current를 더해준다.
이 방식은 roma 알파벳 순서보장이 있기 때문에 가능하다. 이 문제를 풀면서 문제를 잘 읽어보고 이용해야겠다는 생각이 들었다.
var romanToInt = function (s) {
const roma = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };
let result = 0;
for (let i = 0; i <= s.length - 1; i++) {
const current = roma[s[i]];
const second = roma[s[i + 1]];
if (current < second) {
result += second - current;
i++;
} else {
result += current;
}
}
return result;
};