300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 코딩
- 딥러닝
- 백준
- kick start
- 리눅스
- AI
- 운영체제
- 프로그래머스
- OS
- linux
- 킥스타트
- google coding competition
- DFS
- PYTHON
- 알고리즘
- 동적프로그래밍
- 동적 프로그래밍
- 코딩테스트
- 네트워크
- 코딩 테스트
- 구글 킥스타트
- 브루트포스
- nlp
- 프로그래밍
- BFS
- 파이썬
- 그래프
- 순열
- dp
- CSS
Archives
- Today
- Total
오뚝이개발자
Integer to Roman 본문
728x90
300x250
문제
https://leetcode.com/problems/integer-to-roman/
나의 풀이
2가지 방법으로 풀이했다. 첫 번째 방법은 좀 naive한 풀이이고, 두 번째 방법은 변환의 규칙을 파악한 풀이이다.
SOL 1)
- 문제에서 주어진 조건이 num의 범위가 [1,3999]이므로 이 범위 안에서만 변환을 생각하면 된다.
- 예컨대, 256을 변환하려면 200+50+6으로 분해하여 각각을 변환하면 된다.
- 여기서 알 수 있는 점이 천의 자리는 1000,2000,300의 세 가지 경우에 대한 변환이 필요하고, 백의 자리는 100,200,300,...,900의 10가지 경우, 십의 자리는 10,20,30,...,90의 10가지 경우, 일의 자리는 1,2,3,...,9의 10가지 경우데 대한 변환이 필요하다. 즉 다 합쳐도 33가지 경우 밖에 되지 않으므로 이들의 변환에 대해 dictionary에 저장해 매칭시켜 변환하면 된다.
SOL 2)
- 다음과 같이 val과 sym을 선언한다. val = [1000,900,500,400,100,90,50,40,10,9,5,4,1], sym = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"] val에서 각 수는 변환에서 체크해줘야 하는 체크포인트들이다.
- index i를 0부터 증가시켜가면서 val의 값으로 나눠준 몫을 가지고 sym의 문자를 그 몫만큼 답에 이어붙여준다.(이 부분은 코드를 직접 보고 로직을 따라가는 것이 이해가 빠르다. 코드를 보면서 아래 3번의 예시를 적용시켜보기 바란다.)
- 예컨대, num=80이라면 아래와 같은 과정을 거쳐서 십의 자리 8에 대한 변환이 끝난다. 이를 num>0인 동안 반복해주면 일의 자리까지의 변환이 완료된다.
- 80 > 0
80 // 1000 = 0 -> i = 0
80 // 900 = 0 -> i = 1
80 // 500 = 0 -> i = 2
80 // 400 = 0 -> i = 3
80 // 100 = 0 -> i = 4
80 // 90 = 0 -> i = 5
80 // 50 = 1 -> i = 6
코드
SOL 1)
"""
version 1
"""
def intToRoman(self, num: int) -> str:
num_to_roman = {}
# 1~9
for i in range(1,4):
num_to_roman[i] = 'I'*i
num_to_roman[4] = 'IV'
for i in range(5,9):
num_to_roman[i] = 'V'+'I'*(i-5)
num_to_roman[9] = 'IX'
# 10,20,...,90
for i in range(10,40,10):
num_to_roman[i] = 'X'*(i//10)
num_to_roman[40] = 'XL'
for i in range(50,90,10):
num_to_roman[i] = 'L'+'X'*((i-50)//10)
num_to_roman[90] = 'XC'
# 100,200,...,900
for i in range(100,400,100):
num_to_roman[i] = 'C'*(i//100)
num_to_roman[400] = 'CD'
for i in range(500,900,100):
num_to_roman[i] = 'D'+'C'*((i-500)//100)
num_to_roman[900] = 'CM'
# 1000,2000,3000
for i in range(1000,4000,1000):
num_to_roman[i] = 'M'*(i//1000)
s_num = str(num)
unit = []
for i in range(len(s_num)):
unit.append(int(s_num[i])*10**(len(s_num)-i-1))
ans = ""
for u in unit:
if u==0:
continue
ans += num_to_roman[u]
return ans
SOL 2)
"""
version 2
"""
def intToRoman(self,num:int):
val = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
sym = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
s = ""
i = 0
while num>0:
for _ in range(num//val[i]):
s += sym[i]
num -= val[i]
i += 1
return s
728x90
300x250
'코딩 테스트 > 리트코드' 카테고리의 다른 글
3Sum (0) | 2021.07.24 |
---|---|
트리 순회(Tree traversal) 두 가지 구현 방법(재귀, 반복문) (0) | 2021.01.14 |
파이썬 문자열 정렬, 문자열 리스트 정렬, anagram 찾기 (0) | 2021.01.14 |
linked list 정렬하기 (0) | 2021.01.03 |
Finding Anagrams(anagram 찾기) (0) | 2021.01.03 |
Comments