Code KATA | # 4

Jiwon Jung·2021년 1월 10일
0

Code KATA

목록 보기
4/7
post-thumbnail

문제

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

로마 숫자를 숫자로 표기하면 다음과 같습니다.

SymbolValue
I1
V5
X10
L50
C100
D500
M1000

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

III = 3
XII = 12
XXVII = 27입니다.

그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
뒤의 숫자에서 앞의 숫자를 빼주면 됩니다.
9는 IX입니다.
I는 V와 X앞에 와서 4, 9
X는 L, C앞에 와서 40, 90
C는 D, M앞에 와서 400, 900

문제 접근 방식

문제 중점 파악

  • 각 로만 숫자와 대응되는 아라비안 숫자로 리턴
  • 로만 숫자만의 특별한 조합식으로 나오는 아라비안식 숫자로 리턴
  • 4,9, 40, 90 , 400 ,900 분리해서 읽기

해결 방식

  • 로만 숫자와 아라비안 숫자를 딕서너리로 저장
  • 술자를 list 형식으로 변환 후, enumaerate for문을 사용하여 1번째를 제외한 전 인덱스 벨류값과 현재 값을 더한 값을 구한다. 이 값들 중 특별하게 분리해서 읽어야하는 로만 숫자 제외하고 값들을 더하기
    -마지막으로 분리된 값의 특정 값을 더해 리턴하기

나의 코드

def roman_to_num(s):
    #일반 로만 숫자 딕셔너리
    roman_num = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000,
    }

    #특수 로만 숫자 저장
    roman_subtract = {
        'IV': 4,
        'IX': 9,
        'XL': 40,
        'XC': 90,
        'CD': 400,
        'CM': 900,
    }
	
    #인자 리스트로 변환
    s_lst = list(s)
    #첫번째 숫자를 건너뛰기 위한
    first = True
    sum_subtract = 0
    copy_lst = []

    #에뉴머레이트를 이용해 해당 로만숫자를 분리, 특수 로만 숫자 따로 리스트 작성 
    for index, i in enumerate(s_lst):
        if first:
            first = False
            continue
        before = s_lst[index - 1]
        now = i
        rom = before + now
      

        if rom in roman_subtract:
            sum_subtract = sum_subtract + roman_subtract[rom]
            copy_lst.append(index - 1)
            copy_lst.append(index)
	
    #특수 로만 숫자 원 리스트에서 분리
    for i in copy_lst[::-1]:
        s_lst.pop(i)
    a=0
    #일반 로만 숫자의 아라비안 숫자 합 합 구하기
    for k in s_lst:
        a = a+ roman_num[k]
	
    #일반 로만숫자와 특수로만숫자의 아라비안 숫자 합치기
    return a+sum_subtract

What I Learnt

enumerate함수

enumerate 함수를 이용하여 key값과 value 값을 같이 for문을 돌리며 추출하는 방법을 배웠다. key값의 로직을 이용해 결과 되는 value 값을 구하는데 용이하게 사용될 듯하다.

profile
Venire, Videre, Vincere

0개의 댓글