로마자에서 숫자로 바꾸기 1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
요구사항 : 로마자를 숫자로 반환해서 줘라.
제한 사항 : IV, IX 등등 로마자의 계산체계
인풋 : 로마자를 표현한 string값
아웃풋 : 숫자값
본질 : 딕셔너리의 key로 값을 가져오는 성질. 그리고 제한사항에 대한 조건문.
리스트의 각 문자를 숫자값으로 바꾼다?
IX같은 경우는 어떻게 할거야? 반복문에서 바로 하기엔 무리가 있다.
자릿수는 어떻게 할거야? X이전에 오는 I는 X보다 크잖아.
리스트로 만들자! IX, I, X, 이렇게 의미가 확실히 구분되는 문자들끼리. 아니, 자릿수끼리.
by 예랑님.
1. 딕셔너리 정의 : 로마자의 특이한 부분들과, 모든 로마자를 각각 딕셔너리로 만든다.
2. 반복문 : rome_1의 각 문자에 대해서
3. 반복문 안의 반복문 : 해당 문자가 인풋값에 있는 경우에 대해서
4. 딕셔너리 접근 : 여기서 딕셔너리의 키는 곧 로마문자이고 value는 곧 그 문자가 뜻하는 값이므로, 이렇게. (딕셔너리의 items메서드도 알게 됐다. enumerate의 딕셔너리 버전.)
5. += : result에 차곡차곡 그 값을 더한다.
6. replace : 해당 문자를 빈 str값으로 바꾼다. 즉, 없앤다.
def roman_to_num(s):
result = 0
rome_1 = {
‘IV’: 4, ‘IX’: 9,
‘XL’: 40, ‘XC’: 90,
‘CD’: 400, ‘CM’: 900,
}
rome_2 = {
‘I’: 1, ‘V’: 5, ‘X’: 10,
‘L’: 50, ‘C’: 100, ‘D’: 500, ‘M’: 1000,
}
for rome in rome_1:
while rome in s:
result += rome_1[rome]
s = s.replace(rome, ‘’, 1)
for rome in rome_2:
while rome in s:
result += rome_2[rome]
s = s.replace(rome, ‘’, 1)
print(‘result: ’, result)
return result
by (최)준영님.
첫번째 방법과 접근방식이 살짝 다르다. 로마자의 특이한 문자들의 패턴을 읽은 것 같다.
def roman_to_num(s):
all_roman = {
"I":1,
"V":5,
"X":10,
"L":50,
"C":100,
"D":500,
"M":1000
}
result= 0
for i in range(len(s) - 1):
current_one = all_roman[s[i]]
print(current_one)
next_one = all_roman[s[i+1]]
if current_one < next_one:
result -= current_one
else:
result += current_one
result += all_roman[s[-1]]
print(result)
return result
roman_to_num("XXVII")
by 동명님.
두번째와 접근방식이 비슷하다. 그러나 reversed와 집합을 쓴 점이 다르다.
def roman_to_num(s):
romans = {
"I":1,
"V":5,
"X":10,
"L":50,
"C":100,
"D":500,
"M":1000
}
seen = set()
result = 0
for c in reversed(s):
if c not in seen:
seen.add(c)
if c == "V" or c =="X":
romans["I"] = -1
elif c == "L" or c == "C":
romans["X"] = -10
elif c == "D" or c == "M":
romans["C"] = -100
result += romans[c]
return result
roman_to_num("XXVII")