13. Roman to Integer

hs·2021년 9월 5일
1

Leetcode

목록 보기
4/4

🎰 문제

로마문자를 string의 형태로 받았을 때 그 것을 숫자로 반환해주세요.
Symbol Value
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
로마자는 다음과 같습니다.

로마자의 경우 4를 표현할 때는 IIII가 아니라 IV 입니다. 뒤의 숫자에서 앞의 숫자를 빼주면 됩니다. 9는 IX입니다.

I는 V와 X앞에 와서 4, 9 X는 L, C앞에 와서 40, 90 C는 D, M앞에 와서 400, 900

🧩 생각

한 문자씩 가져와서 값을 비교하려 했다 하지만 그렇게 하니 4나 9처럼 작은 수가 앞에 오고 큰 수가 뒤에 오는 부분에서 막혔다..
그러다 모든 조건을 만들어 보자라고 생각해봤다. 작은 수가 앞에 오는 경우를 포함한 나올 수 있는 모든 형태의 로마자를 dictionary형태로 저장을 했다.

🎯 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def romanToInt(self, s: str-> int:
        dic1 = {"I":1,"IV":4,"V":5,"IX":9,"X":10,"XL":40,"L":50,"XC":90,"C":100,"CD":400,"D":500,"CM":900,"M":1000}
 
        tmp = 0
        i = 0
 
        while i<len(s): 
          if s[i:i+2in dic1.keys():
            tmp += dic1[s[i:i+2]]
            i += 2
          else:
            tmp += dic1[s[i]]
            i += 1
 
        return tmp
cs

3 : 나올 수 있는 형태의 로마자를 숫자와 매칭 시켰다.
5~6 : tmp는 return 해줄 숫자이고 i는 인덱스이다.
9~11 : 만약 지금 i의 인덱스 값과 그 다음 값이 dictionary에 존재한다면 그에 맞는 value값을 tmp에 더해주고 그에 맞게 인덱스 값을 2올려주었다.
12~14 : 위의 조건이 맞지않는 경우 그에 맞는 인덱스의 값을 저장해주고 인덱스 값을 1만 증가 시켜주었다.

🏆 아쉬운 점

다른 분의 풀이를 들어보았는데 아주 놀라웠다.
방법은 이러했다. 반복문으로 한 문자씩 돌면서 값을 바꿔주는데 조건으로 로마자의 특징을 보면 "큰수부터 점점 작은수"라는 부분에서 캐치를 하셨다. 만약 현재 변환해주려는 로마자의 뒤의 로마자가 더 큰 수를 나타내는 경우 뒤의 숫자에서 앞의 숫자를 빼주는 식의 코드를 작성하셨다.
아주 대단하시다... 이런식의 알고리즘은 어떻게 생각 할 수 있을까..또다시 위축도 되지만 다시 열심히 착실하게 해보자라는 생각을 가지게 되었다.

profile
무엇이든 끝까지 보람차게

0개의 댓글