상세 컨텐츠

본문 제목

[LeetCode]13. Roman to Integer

문제풀이

by Indigo_Pure 2019. 11. 6. 00:38

본문

728x90
반응형

Problem

로마자를 아라비아 숫자로 변환하는 프로그램

Example

1.
Input: "III"
Output: 3

2.
Input: "CXLVI"
Output: 146

3.
Input: "CDXCIV"
Output: 494

Solution(Code: Javascript)

var romanToInt = function(s) {
    const RomanSet = {
      "I": 1,
      "V": 5,
      "X": 10,
      "L": 50,
      "C": 100,
      "D": 500,
      "M": 1000
    }
    let result = 0;

    for(let i=0; i < s.length; i++) {
      if((i === 0) || (RomanSet[s[i]] <= RomanSet[s[i-1]])) {
        result += RomanSet[s[i]];
      } else {
        result += (RomanSet[s[i]] - 2 * RomanSet[s[i-1]]);
      }
    }

    return result;
};

Thinking

로마자 계산 규칙을 이해하기 위해 시도.
로마자는 많이 봤고 "III" 이건 3이고 "IV" 이게 5-1 이라는건 이미 알고 있었음.
하지만 "MMXVIII" 혹은 "MCMXCVIII" 같은 여러 자리 숫자 계산 규칙을 몰랐음.

"MCMXCVIII" 이 숫자에서 첫번째에서 MC를 먼저 계산해야할지 M, CM인지 어떻게 알수 있을까?

  1. 로마자 계산 규칙
    숫자를 생각할 때 자릿수를 고려한다면 로마자 계산이 쉬워진다.
    1998은 천의 자리 1, 백의 자리 9, 십의 자리 9, 일의 자리 8
    천의 자리 "M", 백의 자리 "CM", 십의 자리 "XC", 일의 자리 "VIII".

  2. 그래서 문자를 어떻게 자르지?
    로마자 숫자를 변환해서 보면 [1000, 100, 1000, 10, 100, 5, 1, 1, 1] 이다.
    그리고 숫자로 계산을 계속 하다보니 몇 가지 규칙이 있다.

1) '작은 수'가 '큰 수' 혹은 '같은 수'를 만나면 더한다.
2) '큰 수'가 '작은 수'를 만나면 뺀다.

이제 해당 규칙대로 코딩을 해보면 된다.


위의 문제 해결 과정은 해당 문제를 해결까지 순차적으로 관련되어지는 것은 아니다.
다만 문제를 생각하면서 해결하기 위해 생각했던 내용들을 나열해 보았다.

728x90
반응형

'문제풀이' 카테고리의 다른 글

Algorithm. 계수정렬  (0) 2017.03.06
Algorithm. 퀵정렬  (0) 2017.02.25
Algorithm. 선택정렬  (0) 2017.02.16
Algorithm. 버블정렬  (0) 2017.02.14
Algorithm. 합병정렬  (0) 2017.02.12

관련글 더보기