[CodeKata]Day5. 로마숫자에서 숫자로 바꾸기

최송희·2021년 3월 8일
0

CodeKata

목록 보기
4/8

문제

로마자에서 숫자로 바꾸기

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"));

0개의 댓글