로마자에서 숫자로 바꾸기
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
나의 답변
<script> function romanToNum(s){ let romaChange = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 } let strArr = s.split(''); // ['M', 'C', 'D', 'X', 'C', 'I', 'V' ] let numArr = strArr.map(e => romaChange[e]); // [ 1000, 100, 500, 10, 100, 1, 5 ] let sum = 0; for(let i=0; i<numArr.length; i++){ if(numArr[i]<numArr[i+1]){ sum = sum + numArr[i+1]-numArr[i]; //i=1 3 5 i = i + 1; } else { sum = sum + numArr[i] //i=0 } } return sum; } romanToNum('MCDXCIV'); //1494 </script>
romaChange
라는 객체를 선언하고 그 안에다 모든 로마자 표기를 적어주었다.- 로마자 예시로 MCDXCI를
split
함수를 사용하여 하나씩 배열로 쪼갠뒤- 쪼갠 로마자들을
map
함수를 활용하여 value값을 가진 새로운 배열로 리턴하였다!!!(romaChange[e] =객체[key] = value)
- 자릿수의 합을 구해야하니 일단 sum=0을 선언하였고
[ 1000, 100, 500, 10, 100, 1, 5 ]
에 for문을 돌리는데- 이 문제의 포인트는 4와 9가 문제이다. IV와 IX로 표현되기 때문이다.
- 배열에서
M=1000
,CD=100 500으로 400
,XC=10 100으로 90
IV=1 5로 4
이렇게 For문의[i]
값에서 조정을 해주어야 한다고 생각하였다.- 결국
numArr[i]<numArr[i+1]
일때numArr[i+1]-numArr[i]
처럼 뒤에서 빼주어야 해당값이 나온다(IV IX)- for문을 순서대로 다돌리면 모든 값이 다 더해지는 오류가 발생하는데
i=0; 1000 (O)
i=1; 400 (O)
i=2; 500 (X)
i=3; 90 (O)
i=4; 100 (X)
i=5; 4 (O)
- 앞 조건문에서
i=1 3 5
, else 에서i=0
만 적용하면 된다. 결국i=2 4
는 버리는 i값이라는 것!!!- 그래서 앞조건문에서
i = i + 1;
을 추가해주면 2, 4값을 버리고 추출할 수 있다. 선택적 추출이랄까...?