▼ 문제 바로가기 (링크) ▼
https://leetcode.com/problems/roman-to-integer/submissions/
검색 없이 혼자 해결해보고 싶어서 고집부리다가 2시간 걸렸다..
문제 푼 시간보다 그냥 포기하고 다른 사람들 답 참고할까 고민하면서 몸부림친 시간이 더 길었다 ..^^
조금 자괴감이 들기도 하지만.. 포기하지 않았음에 의의를..
class Solution:
def romanToInt(self, s: str) -> int:
roman = {"I":1, "V":5, "X":10, "L":50, "C":100,"D":500,"M":1000}
tmp = []
cnt = 0
if ("IV" in s) or ("IX" in s): # 4, 9
roman["I"] = -1
if ("XL" in s) or ("XC" in s): # 40 , 90
roman["X"] = -10
if ("IX" in s): # 1의자리 수와 겹치는 요소 X 예외처리
roman["X"] = 0
if ("CD" in s ) or ("CM" in s): # 400, 900
roman["C"] = -100
if "XC" in s : # 10의자리 수와 겹치는 요소 C 예외처리
roman["C"] = 0
for i in s:
tmp.append(i)
for j in tmp:
j = roman[j]
cnt += j
return cnt
뭔가 완전히 잘못된 것 같으면서도 조금만 고치면 돌아갈 것 같아서
수정하다가 아닌 것 같아서 싹 지우고 다시 가져오고 ..이런 저런 시도를 많이 했다.
처음에는 4 ~ 900 까지의 6가지 예외 케이스를 따로 리스트에 넣어서 ( IV ~ CM)
붙어있는 문자열 그 자체로 인접 여부를 판별하려고 했는데
무조건 한 글자씩 잘라서 리스트에 넣고, for 문을 돌면서 판별하려니 안 될 것 같아서 엎었다.
처음 테스트 케이스 통과해서 제출했더니
100의 자리수가 한 두 번 더 마이너스 되는 문제 발생.
여기에서 겹치는 부분은 제외해 줘야하는 걸 눈치채고
x와 c를 0으로 만드는 코드를 추가했다.
최대한 내가 이미 잘 아는 기능만 활용하거나
원시적인 방식으로 기본 함수, 원리를 활용해서 짜보고 싶다는 욕심이랄까.
정 안 되면 discuss나 구글로 다른 답안을 참고해서 풀 생각이었는데
결국 혼자 해내서 뿌듯하다..! 실행속도 빠른 것도 마음에 들고!
( Runtime: 49 ms, faster than 93.42%
Memory Usage: 14 MB, less than 30.03% )
실행해봤을 때 막히는 케이스가 있으면 바로 추가해서 고치고
다시 돌려서 또 새로운 케이스에서 막히면 그걸로 추가해서 고치면서 완성했다.
그 과정에서 직접 다양한 방식을 시도하고 고민해 볼 수 있어서 좋았다.
'코딩 테스트 > leetCode' 카테고리의 다른 글
[leetCode] 771. Jewels and Stones (Python) (0) | 2022.10.18 |
---|---|
[leetCode] 1512. Number of Good Pairs (Python) (0) | 2022.10.18 |
[leetCode] 2160. Minimum Sum of Four Digit Number After Splitting Digits (Python) (0) | 2022.10.13 |
[leetCode] 2114. Maximum Number of Words Found in Sentences (Python) (0) | 2022.10.12 |
[leetCode] 2413. Smallest Even Multiple (Python) (0) | 2022.10.12 |