리트코드(leetcode) 13번 문제 Roman To Integer
포스트
취소

리트코드(leetcode) 13번 문제 Roman To Integer


Roman to Integer


문자열로 된 로마 숫자를 아라비아 숫자로 변환하는 문제이다.


문제 내용

13. Roman to Integer

Easy


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, 2 is written as II in Roman numeral, just two ones added together. 12 is written as XII, which is simply X + II. The number 27 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.

 

Example 1:

Input: s = "III"
Output: 3
Explanation: III = 3.

Example 2:

Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 3:

Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

Constraints:

  • 1 <= s.length <= 15
  • s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M').
  • It is guaranteed that s is a valid roman numeral in the range [1, 3999].



문제에도 나와있듯 I, X, C 같은 로마 숫자는 특정 로마 숫자 뒤에 올 때 다음 숫자에서 값을 빼줘야 한다.

그래서 I, X, C 의 경우에는 임시 변수에 저장해주고 숫자를 계산해줬다.

먼저 전달 받은 로마 숫자 문자열을 char 배열 형태로 변환한 후

반복문을 통해 요소에 하나 씩 접근해줬다.

또 시간을 줄이기 위해 switch 문을 이용하여 조건이 맞을 시 바로 loop를 넘겼다.



답안 보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Solution {
    public int romanToInt(String s) {
        
        char[] arr = s.toCharArray();
		int answer = 0;
		char temp = '0';
		
		for(int i=0; i<arr.length; i++) {
			switch(arr[i]) {
			
				case 'I': 
					answer += 1;
                    
          // 임시 변수에 저장
					temp='I';
					break;
					
				case 'V':
          // 임시 변수가 I일 때와 아닐 때 값을 다르게 추가
					if(temp == 'I') answer += 3;
					else answer += 5;
					temp = 'V';
					break;
					
				case 'X':
					if(temp == 'I') answer += 8;
					else answer += 10;
					temp = 'X';
					break;
					
				case 'L':
					if(temp == 'X') answer += 30;
					else answer += 50;
					temp = 'L';
					break;
					
				case 'C':
					if(temp == 'X') answer += 80;
					else answer += 100;
					temp = 'C';
					break;
					
				case 'D':
					if(temp == 'C') answer += 300;
					else answer += 500;
					break;
					
				case 'M':
					if(temp == 'C') answer += 800;
					else answer += 1000;
					break;
			}
		}
		
        return answer;
    }
}
                               



확실히 for문만 쓰는 것보다 switch문으로 break를 걸어주었더니 속도가 빨라지는 것을 느낄 수 있었다.



이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.