[ Code Kata ] 🀯 Python #6 둜마자λ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•˜κΈ°

HaileeΒ·2020λ…„ 12μ›” 7일
0

[ Code Kata ]

λͺ©λ‘ 보기
12/28
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

1μ‹œκ°„λ™μ•ˆ 동기와 κ³ λ―Όν•œ κ²°κ³Ό, 우리의 가섀은 λ‹€μŒκ³Ό κ°™μ•˜λ‹€.

  • dictionary 내뢀에 key, value둜 λ‘œλ§ˆμžμ™€ ν•΄λ‹Ή 값을 지정해두기
  • ν•œ κΈ€μžμ”© λ‹€μŒ κΈ€μžμ™€ 비ꡐλ₯Ό λ°˜λ³΅ν•˜λ˜,
    이전 μˆœμ„œμ˜ 둜마자 값이 더 μž‘μ€κ²½μš° - 연산을 ν•˜κ³  κ·Έ λ‹€μŒ κΈ€μžμ˜ λ°˜λ³΅λ¬Έμ€ passν•˜λ„λ‘ ν•  것
    πŸ‘‰πŸ» 이걸 λ„λŒ€μ²΄κ°€ μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Όν•˜λ‚˜ 싢은거지..

κ²°κ΅­ λͺ»μ°Έκ³  1μ‹œκ°„ 뒀에 ꡬ글링을 μ‹œλ„ν–ˆλ‹€.
λ³΄ν†΅μ˜ ν’€μ΄λŠ” 둜마자둜 λ‚˜μ˜¬ 수 μžˆλŠ” μ˜ˆμ™Έμ μΈ 경우, (90, 40...)에 λŒ€ν•œ 처리λ₯Ό 미리 ν•΄ 두고 λ¬Έμžμ—΄μ„ λŒ€μ‘°ν•˜λ˜λ°,
μš°λ¦¬κ°€ μƒκ°ν•œ κ°€μ„€κ³Ό μΌμΉ˜ν•˜λŠ” 둜직이 μžˆλŠ”μ§€ κΆκΈˆν•΄μ„œ κ³„μ†ν•΄μ„œ ꡬ글링을 ν–ˆλ‹€.

[파이썬] 둜마숫자λ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ³€ν™˜ν•˜κΈ°
πŸ‘†πŸ» ν•΄λ‹Ή 풀이가 우리의 κ°€μ„€κ³Ό κ°€μž₯ λ§žμ•„λ“€μ—ˆλ‹€.

def  roman2int(roman):
    def getdv(r):
        p = 'IVXLCDMF'.find(r)
        return 0 if p < 0 else 10**(p // 2) * (1 (4*(p % 2)))
 
    i = 0
    v = map(getdv, roman)
    s = 0
    while i < len(v):
        if i 1 == len(v) or v[i] >= v[i+1]: s += v[i]
        else: s -= v[i]
        i  = 1
    return s

ν•˜μ§€λ§Œ μŠ¬ν”„κ²Œλ„ 파이썬의 map ν•¨μˆ˜λ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν•΄μ„œγ… γ… γ… γ… 
λ‹€λ₯Έ λ™κΈ°λΆ„λ“€μ—κ²Œ μ§ˆλ¬Έν•˜κΈ° μ‹œμž‘ν–ˆλ‹€.
μš°λ¦¬κ°€ μƒκ°ν•œ κ°€μ„€λ‘œ 문제λ₯Ό ν’€ 수 μžˆλŠ”κ±΄μ§€..!

μ •λ‹΅ μ½”λ“œ

def roman_to_num(s):
  # 여기에 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.
    a = [β€˜4’,β€˜9’,β€˜40’,β€˜90’,β€˜400’,β€˜900’]
    r = [β€˜IV’,β€˜IX’,β€˜XL’,β€˜XC’,β€˜CD’,β€˜CM’]
    b = [β€˜1’,β€˜5’,β€˜10’,β€˜50’,β€˜100’,β€˜500’,β€˜1000’]
    o = [β€˜I’,β€˜V’,β€˜X’,β€˜L’,β€˜C’,β€˜D’,β€˜M’]
    new=[]
    for i in range(len(a)):
      if r[i] in s:
          s=s.replace(r[i],a[i])
          new.append(a[i])
    for i in range(len(s)):
      if s[i] in o:
          index=o.index(s[i])
          new.append(b[index])
    return sum(list(map(int,new)))

μˆ˜λ§Žμ€ μ½”λ“œ μ€‘μ—μ„œ λ―Όμ² λ‹˜μ΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ°Έκ³ ν•˜κΈ°λ‘œ ν–ˆλ‹€.
이미 μ˜ˆμ™Έμ μΈ κ²½μš°μ— λŒ€ν•œ 처리λ₯Ό ν•΄ 두신 κ²½μš°μ˜€λ‹€.

첫번째 λ°˜λ³΅λ¬Έμ„ ν†΅κ³Όν•˜κ³  λ‚˜λ©΄ λ„˜μ–΄μ˜¨ κ°’ sλŠ” λ¬Έμžμ—΄, μˆ«μžκ°€ μ„žμΈ 단어가 λœλ‹€.
그리고 이 쀑 μΆ”μΆœλœ μˆ«μžλŠ” new λΌλŠ” 리슀트 내에 λ‹΄μ•„λ‘˜ 것!

이후 λ‘λ²ˆμ§Έ λ°˜λ³΅λ¬Έμ„ ν†΅ν•΄μ„œ λ‚˜λ¨Έμ§€ κΈ€μžλ“€μ˜ 숫자λ₯Ό μ‘°ν•©ν•œ λ’€ new 리슀트 내에 λ‹΄μ•„μ£ΌλŠ” 것!

λ§ˆμ§€λ§‰μ— 리턴 ν•  λ•Œ new 리슀트 λ‚΄ λͺ¨λ“  값듀을 λ”ν•΄μ„œ λ°˜ν™˜ν•œλ‹€.


ν˜Όμžμ„œ .. 계속 미리 값을 정해두면 8λ§Œμ„ κ³„μ‚°ν•˜κ³  싢을땐? λ„ˆλ¬΄ λΉ„νš¨μœ¨μ μΈκ±° μ•„λ‹Œκ°€? 라고 μƒκ°ν–ˆλŠ”λ°
κ·Έκ±Έ λ”°μ§ˆ κ²½μš°κ°€ μ•„λ‹ˆμ—ˆλ˜ 것 κ°™λ‹€.
이해 갈 λ•ŒκΉŒμ§€ κ³„μ†ν•΄μ„œ λ‹€μ‹œ 듀여닀봐야지 🀯

profile
μ›Ή 개발 πŸ·πŸ˜ŽπŸ‘ŠπŸ»πŸ”₯

0개의 λŒ“κΈ€