[Leetcode(Easy)] Roman to Integer

hyozkim·2020년 1월 22일
0

알고리즘

목록 보기
3/14

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

문제

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
For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

풀이

- 이전 풀이

'I','X','C' 일 때, 다음(Next) 문자를 검사해서 더 하였고, 그 외 'V', 'L', 'D', 'M' 문자는 값 그대로 더하여 계산했다.

'I' -> 'V' : 4
'I' -> 'X' : 9
'X' -> 'L' : 40
'X' -> 'C' : 90 
'C' -> 'D' : 400
'C' -> 'M' : 900

문제는 풀 수 있었지만 소스가 너무 길어졌다.

- 현재 풀이

로마 숫자를 거꾸로 읽어 계산하면 다음과 같은 공식으로 구할 수 있었다.
1. Roman numerals 끝에서부터 거꾸로 계산한다.
2. 현재 값이 이전 값보다 작으면 값을 빼고 더해준다. (ex. IV, IX, XL, XC, ...)
3. 현재 값이 이전 값보다 크면 그대로 더해준다.

코드

class Solution {
    public int getValue(char ch) {
        return ch == 'I' ?  1 : ch == 'V' ?  5 : ch == 'X' ?  10 : ch == 'L' ?  50 : ch == 'C' ?  100 : ch == 'D' ?  500 : 1000;
    }

    public int romanToInt(String s) {
        int answer = 0;

        int prev = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            int curr = getValue(s.charAt(i));
            if( curr < prev ) {	// 현재 값이 더 작으면 빼서 (이전값-현재값) 더해줌
                answer -= prev;
                answer += (prev-curr);
            } else {			// 현재 값이 더 크면 더해줌
                answer += curr;
            }

            prev = curr;
        }
        return answer;
    }
}
profile
차근차근 develog

0개의 댓글