이제까지는 글을 내가 공부한 걸 정리한다는 느낌으로 썼다. 하지만 면접을 보면서 다른 사람에게 설명하는 것에 미숙하다고 생각하게 됐고, 앞으로는 읽는 사람이 이해할 수 있게 글을 써야겠다고 생각했다.
1. 문제
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 one's 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.
로마 숫자는 I, V, X, L, C, D, M으로 표현한다. 각 알파벳은 1, 5, 10, 50, 100, 500, 1000에 대응된다.
예를 들면 2는 II(11 -> 1+1), 12는 XII(1011 -> 10+1+1). XXVII(1010511 -> 10+10+5+1+1)처럼 계산할 수 있다.
로마 숫자는 왼쪽에서부터 오른쪽으로 읽고, 큰 수부터 작은 수 순서대로 썼다. 위에서 든 예시처럼 1000(M), 500(D), 100(C), 50(L), 10(X), 5(V), 1(I)의 순서다. 그런데, 숫자 4는 IIII가 아닌 IV(51 -> 5-1)라고 쓴다. 숫자 9에도 이가 적용되서 IX라고 쓸 수 있다.
이러한 상황에서 주어진 로마 숫자(str)를 아라비아 숫자(int)로 바꾸는 문제다 .
2. 코드
class Solution:
def romanToInt(self, s: str) -> int:
dictionary = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
answer = 0
past = 'I'
for current in s[::-1]:
answer = answer - dictionary[current] if dictionary[current] < dictionary[past] else answer + dictionary[current]
past = current
return answer
우선 로마 숫자가 어떤 아라비아 숫자에 대응되는지 문제에 설명이 나와있으니까 딕셔너리로 저장한다.
그리고 큰 숫자에서부터 작은 숫자로 로마 숫자가 작성되어 있으니까, 작은 숫자에서부터 큰 숫자로 보기 위해 입력받은 string을 [::-1]을 사용해서 뒤집어서 변환한다.
왜냐면 아까 위에서 4는 IV고 6은 VI라고 했는데, 이걸 보면 작은 수가 앞에 있으면 큰 수 - 작은 수를 해야 한다는 걸 알 수 있다. 이 작업을 편하게 해주기 위해 s를 뒤집는다.
가장 작은 수가 'I'니까 비교를 할 수 past는 'I'로, answer는 0으로초기화한상태에서 for loop를시작한다. 그리고 answer에 수를 더할지, 뺄지를 결정하기 위해 현재 숫자(current)와 과거 숫자(past)를 비교한다. current가 past보다 작으면(ex. IV - I: current, V: past) answer에서 current를 빼주고, 같거나 크면 answer에 current를 더하면 된다.
'Algorithm > Python' 카테고리의 다른 글
[leetecode 오늘의 문제] 1235. Maximum Profit in Job Scheduling (0) | 2024.01.06 |
---|---|
[Python/LeetCode]Palindrome Number (0) | 2021.07.01 |
[파이썬/LeetCode 792]Number of Matching Subsequences (0) | 2021.06.23 |
[파이썬/프로그래머스]여행경로 (0) | 2021.05.18 |
[파이썬/프로그래머스]단어 변환 (0) | 2021.05.18 |