[Algorithm] LeetCode 12 - Integer to Roman in Python(파이썬)

하이초·2023년 6월 14일
0

Algorithm

목록 보기
62/94
post-thumbnail
post-custom-banner

💡 LeetCode 274:

숫자를 로마자로 바꾸기

🌱 코드 in Python

알고리즘: 냅다 풀기

class Solution:
    def intToRoman(self, num: int) -> str:
        one = ["", "I", "X", "C", "M"]
        five = ["", "V", "L", "D"]
        ans = ""
        for i, c in enumerate(str(num)):
            digit = len(str(num)) - i
            n = int(c)
            if n < 4 or (n > 4 and n < 9):
                if n > 4:
                    ans += five[digit]
                for j in range(n % 5):
                    ans += one[digit]
            elif n == 4:
                ans += one[digit]
                ans += five[digit]
            elif n == 9:
                ans += one[digit]
                ans += one[digit + 1]
        return ans

27의 경우 XX + V + II 와 같이 앞에서부터 문자를 붙여나가야 하기 때문에
일의 자리부터 처리하는 것보다는 앞자리부터 하는 것이 낫다고 생각했다.

따라서 들어온 숫자를 자릿수마다 한자리씩 떼어놓는 것이 필요했는데,
나는 int로 들어온 num을 string으로 변환한 뒤 다시 int로 변환하여 보는 식으로 하였다.
각 자릿수를 알기위해서 enumerate도 같이 사용해주었다.

int -> str -> int가 조금 번거로운 작업이긴 한 것 같은데,
다른 방법이 생각나지 않아 그냥 강행했다..!

그 다음으로 로마자가 변하는 분기를 10단위와 5단위로 나누어 배열을 만들어주었다.
배열에 "" 이러한 빈문자열을 추가한 이유는 각 자릿수에 바로 접근할 수 있게 하기 위해서였다.

digit = len(str(num) - i - 2
와 같은 식으로 할 수도 있겠지만 별로 보기 안 예쁘니까..!!

저 공간이 엄청난 메모리를 잡아먹는 것도 아니고 해서 그냥 그렇게 했다.
그렇게 됐다..!!

그리고 숫자들의 분기를 또 나누어주었다.
1, 2, 3은 one 배열의 자릿수에 맞는 로마자를 자신만큼 반복해서 써 주어야 한다.

5는 five 배열의 자릿수에 맞는 로마자를 넣어주어야 한다.

6, 7, 8은 five 배열의 자릿수에 맞는 로마자를 넣고 one 배열의 자릿수에 맞는 로마자를 자신 - 5 한 만큼 반복해서 써 주어야 한다.

4는 one 배열의 자릿수에 맞는 로마자 + five 배열의 자릿수에 맞는 로마자를 넣어주어야 한다.

9는 one 배열의 자릿수에 맞는 로마자 + one 배열의 (자릿수 + 1)에 맞는 로마자를 넣어주어야 한다.

해당 규칙을 통해 위와 같은 코드를 작성해주었다.

🧠 기억하자

이번 문제의 경우 로마자의 경우의 수가 그렇게 많지 않아
가능한 로마자를 전부 배열에 박아놓고 풀이하는 것을 보았다.

시간으로는 정말 굉장히 빠를 것으로 보인다.
하지만 혹시 빠트린 로마자가 있다면? 등 더 복잡한 경우에 휴먼 에러를 발생할 수 있는 코드가 아닐까 싶었다.

하지만 이번 문제는 경우의 수가 많지 않고,,
오히려 더 알맞은 접근법일 수도 있다는 생각도 동시에 든다...

아무튼! 나는 이렇게 풀었다.

LeetCode 12 바로가기

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.
post-custom-banner

0개의 댓글