코딩 테스트/leetCode

[leetCode] 13. Roman to Integer (Python)

우주바다 2022. 10. 14. 16:35
728x90

▼ 문제 바로가기 (링크) 

https://leetcode.com/problems/roman-to-integer/submissions/

 

Roman to Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


검색 없이 혼자 해결해보고 싶어서 고집부리다가 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% )

 

실행해봤을 때 막히는 케이스가 있으면 바로 추가해서 고치고

다시 돌려서 또 새로운 케이스에서 막히면 그걸로 추가해서 고치면서 완성했다.

그 과정에서 직접 다양한 방식을 시도하고 고민해 볼 수 있어서 좋았다. 

728x90
반응형