[CodeKata] 6. roman_to_num

그냥·2022년 6월 14일
0

CodeKata

목록 보기
5/18

문제

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

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

Symbol	Value
I	1
V	5
X	10
L	50
C	100
D	500
M	1000
로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다. 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. 문제의 조건 정리
1) 로마자 숫자는 왼쪽 숫자가 오른쪽 숫자보다 크냐 작냐에 따라서 계산법이 달라진다.
- 왼쪽 < 오른쪽 : 오른쪽 - 왼쪽
- 왼쪽 < 오른쪽 : 오른쪽 + 왼쪽
2) 인자로 로마자(str형)을 준다.
3) 정수형으로 반환한다.

  1. 조건에 대한 코드 구현 방법 생각
1) I~M까지의 로마자와 숫자를 dict형으로 저장한다.
2) 인자값에 대해서 같은 문자가 있으면 dict에서 key 인덱싱을 통해서 value값을 가져온다.
3) 인자값에서 for문을 돌리고 s[i] s[i+1]의 값을 비교한다.
- s[i] < s[i+1] 이라면 s[i]을 뺴준다.
- s[i] > s[i+1] 이라면 s[i]를 더해준다.
4) i+1은 len(s)시 indexOutofRange 에러가 발생하므로 len(s)-1까지 돌려준다.
5) 모두 더한 값을 반환한다.

  1. 구현 코드
def roman_to_num(s):
  # 여기에 코드를 작성해주세요.
  result = 0
  roman_number = {
    "I" : 1,
    "V" : 5,
    "X" : 10,
    "L" : 50,
    "C" : 100,
    "D" : 500,
    "M" : 1000,
  }

  for i in range(len(s)):
    
    if i < len(s)-1 and roman_number[s[i]] < roman_number[s[i+1]] :
      result -= roman_number[s[i]]
   
    else :
      result += roman_number[s[i]]
    
  return result

  1. 코드 리뷰
  • 코드 구현을 위한 생각을 할 때처럼 dict 변수를 선언하여 거기에 로마자 숫자와 숫자를 key : value 형식으로 저장한다.
  • 모든 값을 더할 정수형 변수 result를 선언한다.
  • 인수 s에 대한 len(s)를 for 문으로 돌리는데 s[i]와 s[i+1] 비교시 s[i+1]을 len(s) range에서 끝까지 돌리면 indexOutofRange 에러가 발생하므로 if i < len(s) -1 조건을 주었다.

0개의 댓글