12. Integer to Roman
제시된 정수를 로마자로 변경하여서 출력하는 알고리즘이다.
문제조건
로마자는 많은 이들이 알듯, 표기방식이 굉장히 독특하다.
1 -> I / 2-> II / 3 -> III / 4 -> IV
위와 같이 1,2,3은 똑같이 진행되다가, 4에서는 상위 레벨의 문자에서 이전 레벨의 문자를 앞에 표기하는 식으로 진행된다.
Symbol의 레벨은 각 자릿수의 5의 배수에서 변경 됨을 알 수 있다.
조건을 해석해서 결과를 예측해보면 위와 같은 예시를 볼 수 있다.
또한 입력값의 범위가 1에서 3999까지로 한정되어있다. 마지막 자리를 비교적 신경을 덜 써도 됨을 알 수 있다.
문제풀이
먼저 연산의 편의를 위하여 어떤 수가 들어오던 4자리의 수로 맞춰주어야 하겠다는 생각을 먼저 했다.
그래서 입력된 정수를 List로 변경하고, 이 List의 length가 4보다 작을 경우 4가 될때까지 앞에 0을 삽입해준다.
ex) 3 -> [0,0,0,3]
다음으로는 각 자리를 로마자로 변경하는 작업을 해야하는데, 이 과정에서 각 자리의 변경작업이 동일하게 이루어지므로, 함수를 지정해서 사용하면 좋겠다는 생각을 하였다.
그래서 그 자리의 값(num), 1의자리 로마자(one), 5의자리 로마자(five), 10의 자리 로마자(ten)를 인자로 받는roman함수를 생성해준다.
그 후, 이 연산에서 특이한 값은 4의 연산, 4와 9가 특이하게 연산된다. 이런 case는 따로 Exeption으로 지정하여 초기에 연산하여 준다.
위의 case가 아닌 경우는 공통적으로 연산된다. 먼저 num이 5보다 작은지 확인한다. 5보다 같거나 클 경우, five를 처음에 붙여준다. 다음으로 one을 필요값만큼 붙여주는데, 이 필요값은 num을 5로 나눈 나머지를 의미한다.
이러한 연산을 각 자리 진행해주고, python에서 str은 +연산을 지원하므로, 간단하게 정리했다.
소스코드
class Solution:
def roman(self, num:int, one:str, five:str, ten:str) -> str:
if num==9: return one+ten
if num==4: return one+five
ret = ''
if num>=5:ret+=five
for _ in range(num%5):
ret+=one
return ret
def intToRoman(self, num: int) -> str:
num_list = list(str(num))
num_list = list(map(lambda x : int(x),num_list))
if len(num_list) != 4:
for _ in range(4-len(num_list)):
num_list.insert(0,0)
answer = self.roman(num_list[0], 'M', 'A', 'A') + self.roman(num_list[1], 'C', 'D', 'M') +
self.roman(num_list[2], 'X', 'L', 'C') + self.roman(num_list[3], 'I', 'V', 'X')
return answer
answer의 첫번째 roman, five와 ten의 값은 dummy data를 넣어주었습니다.
'기타' 카테고리의 다른 글
GitHub Actions Workflow의 Event Trigger(On, Schedule) (0) | 2020.10.24 |
---|---|
I'm a night?? I'm a early?? (2) | 2020.10.21 |
Arctic Code Vault Contributor? 넌 누구냐..! (0) | 2020.07.18 |
어디서 많이 본 workflow Scope 에러 해결법 (3) | 2020.07.05 |
1. GIT 설치부터 시작해서 설정까지 (0) | 2020.07.02 |
댓글