문제
로마자에서 숫자로 바꾸기
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
- 객체에 로마숫자를 key:value 로 선언
- 본인 뒤에 숫자가 본인보다 큰경우에는 빼기를 한다.
- 스타트 인덱스를 기준으로 잡고, 빼기를 해야하는 경우에는 2칸 뒤 문자부터 체크, 아니면 바로 다음 문자체크
function romanToNum(s) {
const str = s;
const t = {
"I" : 1
,"V" : 5
,"X" : 10
,"L" : 50
,"C" : 100
,"D" : 500
,"M" : 1000
}
let sum =0;
let i = 0
while (i<str.length){
console.log(i);
if( t[str[i+1]] > t[str[i]]){
sum += t[str[i+1]]-t[str[i]];
i++
}else{
sum += t[str[i]];
}
i++
}
return sum;
}
console.log(romanToNum("MCMXCIV"));
배운점
한번에 성공하진 못했다, 처음엔 for문을 하나씩 돌려 뒤에 작은수가 나오면 그순간 리턴을 해주려야였지만, "MCMXCIV"값이 들어왔을 경우 만족하지 못하였다. 다시 리셋하고 자리수 이동에 포커스를 두고! 생각하였다.//잘못 굴린 짱구 function romanToNum(s) { let sum =0; for (let i in str){ let index = parseInt(i); if( t[str[index+1]] && t[str[index+1]] > t[str[index]]){ console.log(index,str[index], t[str[index]], t[str[index+1]]); sum+= t[str[index+1]]-t[str[index]]; if(!t[str[index+2]]) { return sum; } }else{ sum += t[str[index]]; } } return sum; } console.log(romanToNum("MCMXCIV"));