CodeKata 2-1

chaerin·2021년 2월 1일
0

CodeKata

목록 보기
1/4

로마자에서 숫자로 바꾸기

1 ~ 3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환하기

로마 숫자를 숫자로 표기하면 아래와 같다.

로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 된다.

III = 3
XVI = 12
XXVII = 27

그런데 4를 표현할 때는 IIII가 아니라 IV이다.

뒤의 숫자에서 앞의 숫자를 빼주면 된다.

따라서 9는 IX이다.

I는 V와 X앞에 와서 4, 9
X는 L, C 앞에 와서 40, 90
C는 D,M 앞에 와서 400, 900

1. 우선 '키: 값'의 형태인 딕셔너리로 로마숫자와 숫자를 정의해준다.

    roman = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }

2. for문을 사용하여 주어진 로마숫자를 차례로 하나씩 불러온다.

for문 안에서 다음(뒤)에 위치한 로마숫자와 비교할 것이기 때문에 마지막 로마숫자를 제외한 끝에서 두번째 위치한 로마숫자까지로 범위를 정한다.

    for i in range(len(s)-1):

3. 로마숫자에 정의된 숫자를 비교한다.

뒤(다음)에 위치한 로마숫자의 숫자가 더 작을 경우 정상적으로 결과값에 더해지지만, 뒤에 위치한 로마숫자의 숫자가 더 클 경우에는( IV = 4, IX = 9 등등) 음수의 형태로 더해지는 것으로 여기고 결과값에서 빼준다.

        if roman[s[i]] < roman[s[i+1]]:
             result -= roman[s[i]]
        else:
            result += roman[s[i]]

4. 앞서 제외되었던 로마숫자의 마지막을 결과값에 더해준다.

    result += roman[s[-1]]

5. 결과 반환

    return result

총정리

def roman_to_num(s):
    roman = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }

    result = 0
    for i in range(len(s)-1):
        if roman[s[i]] < roman[s[i+1]]:
             result -= roman[s[i]]
        else:
            result += roman[s[i]]

    result += roman[s[-1]]

    return result

🥦 문제를 이해하기 위해 필요했던 부분
만약 99의 숫자를 반환하고 싶으면 로마숫자 'IC'가 주어지면 안될까??

안됨. 99의 숫자를 반환하고 싶다면 90의 숫자와 9의 숫자를 만든다는 생각으로

90의 숫자를 만드는 'XC'의 조합과 9의 숫자를 반환할 수 있는 'IX'의 조합을 더한 'XCIX'로 만들어진다.

0개의 댓글