로마자 표기법을 숫자로 바꿔보는 문제라고 할 수 있다.
로마자에서 숫자로 바꾸기 1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
로마 숫자를 숫자로 표기하면 다음과 같습니다.
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다.
III = 3
XII = 12
XXVII = 27입니다.
그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
뒤의 숫자에서 앞의 숫자를 빼주면 됩니다.
9는 IX입니다.
I는 V와 X앞에 와서 4, 9
X는 L, C앞에 와서 40, 90
C는 D, M앞에 와서 400, 900
def roman_to_num(s):
rom = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
int = 0
for i in range(len(s)):
if i > 0 and rom[s[i]] > rom[s[i - 1]]:
int += rom[s[i]] - 2 * rom[s[i - 1]]
else:
int += rom[s[i]]
return int
나는 접근하다 1시간이 다되서 못 풀었지만, 시간을 넘어서 아래 모범답안처럼 풀었던거 같다.
다른팀도 접근 방식은 비슷했던거 같다. 그러나 위의 솔루션은 되게 간단하게 규칙을 찾아냈던것이 인상깊었다.
똑같이 일단 딕셔너리에 넣고 비교를 할 생각으로 시작을 하되 포인트는 원래 문자열에서
값과 거기서 하나를 빼준 값과 비교해서 거기서의 패턴을 발견하여 저렇게 더해서 넣어주고 그게 아니라면 원래 문자열 value에 값을 더해준 것이다.
numbers = {
"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,
}
def roman_to_num(s):
if not s:
return 0
if numbers.get(s[:2]):
return numbers.get(s[:2]) + roman_to_num(s[2:])
return numbers.get(s[:1]) + roman_to_num(s[1:])
아예 예외 처리 까지한 것을 전부 딕셔너리 형태로 저장해놓고 하는 걸로 우리팀이 생각한게 맞다 이렇게하면 복잡하게 규칙을 생각 할 필요 없이 xl 처럼 두 문자 붙는걸생각해서 2개 단위로 끊어서 더해주면 된다.