leetcode

13. Roman to Integer

냠냠맨 2022. 11. 28. 15:50

문제링크

https://leetcode.com/problems/roman-to-integer/

 

Roman to Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제정보

 

로마자로 구성된 문자열 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을 선언해서 푸는 솔루션입니다.

이것도 흥미롭네요

 

반응형