CK week2 day1

BnDC·2021년 9월 27일
0

code Kata

목록 보기
6/22

🧨 문제

로마자 숫자 표기로 문자열이 들어왔을 때,
그것을 숫자(1~3999)로 반환하는 함수를 만들어라

SymbolValue
I1
V5
X10
L50
C100
D500
M1000

로마자로 숫자로 표기 할 때는,
Symbol에 대응하는 기호의 갯수 만큼 value를 갖게 된다.
ex) III= 3, XX = 20, DCL = 650

그러나

4, 40, 400는 IIII,XXXX, CCCC아닌 IV,XL,CD으로, (5-1, 50-10, 500-100) 표기 한다.

9, 90, 900는 VIIII,LXXXX,DCCCC
아닌 IX, XC, CM으로 (10-1, 100-10, 1000-100) 표기 한다.


s = III -> 3 반환,
s = IX -> 9 반환,
s = MCMXCIX -> 1999 반환






🎯 내 풀이


def roman_to_num(s):
#step1
  romans = ['I', 'V', 'X', 'L', 'C', 'D', 'M', 'F']
  nums   = [1, 5, 10, 50, 100, 500, 1000, 5000]
  result = 0

#step2
  for i in range(len(romans)):
    result += s.count(romans[i]) * nums[i]

#step3
    if i % 2 == 0 and i < 6:
      forth = romans[i] + romans[i+1]
      ninth = romans[i] + romans[i+2]
      
      result -= s.count(forth) * nums[i] * 2
      result -= s.count(ninth) * nums[i] * 2
  
  return result
  




📍 step 1

def roman_to_num(s):
  romans=['I', 'V', 'X', 'L', 'C', 'D', 'M', 'F']
  nums = [1, 5, 10, 50, 100, 500, 1000, 5000]
  result = 0

로마 기호를 담을 romans,
기호에 대응 하는 숫자를 담을 nums
결과를 담을 result 선언



📍 step 2


for i in range(len(romans)):
    result += s.count(romans[i]) * nums[i]

로마자 표기로 들어온 입력s에 있는
특정 로마자 기호의 갯수를
그 기호에 해당하는 수와 곱해 result에 더한다.



📍 step 3

for i in range(len(romans)):
    result += s.count(romans[i]) * nums[i]

    if i%2==0 and i<6:
      forth = romans[i] + romans[i+1]
      ninth = romans[i] + romans[i+2]
      
      result -= s.count(forth) * nums[i] * 2
      result -= s.count(ninth) * nums[i] * 2
  
  return result

4, 9, 40, 90, 400, 900 (예외적인 숫자) 에
해당하는 (IV,IX, XL, XC, LC,LM)이 들어오면,

(I, X, L에 해당 하는 숫자) ×2\times 2
result에서 뺀다


만약 예외적인 숫자가 들어오지 않으면, `s.count(forth)`나 `s.count(ninth)` 는 0이 됨으로 `result`에서 아무것도 빼지 않는다. 최종적으로 구해진 `result`에서 반환한다.

×2\times 2 를 하는 이유

  • 앞에서 잘못 더해준 (I, X, L)을 한 번 빼준다
  • 로마자 표기에서 I,X,L55, 1010 단위 숫자 앞에 오면, I, X, L에 해당하는 숫자를 빼서 숫자를 표기 하기 때문



🧵 예시

XCIX= 99

step 2에서
result
(I갯수)×1+(X갯수)×10+(C갯수)×100(I 갯수)\times 1 + (X 갯수)\times 10+(C 갯수)\times 100을 계산해서
100+20+1=121100+20+1=121 이 된다.


step3
그런데 XC , IX 의 경우 (100 - 10, 10 - 1)
이 되어야 함으로,

먼저 앞서 잘못 더한 X, I에 해당하는 10, 1을 한번 씩 빼주어야 한다 121101=110121 - 10 - 1=110

그런 다음 올바른 답을 도출하기 위해 X, I를 한 번씩 더 빼주어야 한다. 121101=99121 - 10-1=99

profile
“Life is C (Choice) between B (Birth) and D (Death).” - 인생은 B와 D사이의 C

0개의 댓글