숫자를 로마자로 바꾸기
알고리즘: 냅다 풀기
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)에 맞는 로마자를 넣어주어야 한다.
해당 규칙을 통해 위와 같은 코드를 작성해주었다.
이번 문제의 경우 로마자의 경우의 수가 그렇게 많지 않아
가능한 로마자를 전부 배열에 박아놓고 풀이하는 것을 보았다.
시간으로는 정말 굉장히 빠를 것으로 보인다.
하지만 혹시 빠트린 로마자가 있다면? 등 더 복잡한 경우에 휴먼 에러를 발생할 수 있는 코드가 아닐까 싶었다.
하지만 이번 문제는 경우의 수가 많지 않고,,
오히려 더 알맞은 접근법일 수도 있다는 생각도 동시에 든다...
아무튼! 나는 이렇게 풀었다.