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
for문으로 문자를 하나씩 확인하면서, 두 가지 경우만 고려하면 된다.
먼저 로마문자에 대한 값을 차례로 배열로 만들어주고, 인자로 받은 문자 's'를 숫자로 대체하기 위해 split('')
으로 배열을 만들어준다. 그리고 배열로 만들어 준 's'를 엘리먼트 하나씩 돌면서 로마문자에 대한 숫자값으로 대체해준다.
그리고 for문으로 대체한 숫자값 배열의 엘리먼트를 하나씩 돌면서, 위에 언급한 두 가지 경우를 고려하여 연산을 수행한다.
function romanToNum(s) {
const romeNum = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
let result = 0
const romeArray = s.split('')
const numArray = romeArray.map(rome => romeNum[rome])
for (i=0; i<numArray.length; i++) {
if (numArray[i] < numArray[i+1] ) {
result -= numArray[i]
} else {
result += numArray[i]
}
}
return result
}
console.log(romanToNum('III')) // 3
console.log(romanToNum('XII')) // 12
console.log(romanToNum('XXVII')) // 27
console.log(romanToNum('MCMXCIV')) // 1994
안녕하세요^^ 반갑습니다. 자스를 시작한지 얼마 안 자린이 입니다^^
for (i=0; i<numArray.length; i++) {
if (numArray[i] < numArray[i+1] ) {
result -= numArray[i]
} else {
result += numArray[i]
}
이 부분에서,
예를들어서, console.log(romanToNum('III')) 라고 한다면
i=2 이 되는 순서가 오게되면
numArray[i] < numArray[i+1] 가
numArray[2] < numArray[3] 이 되버립니다.
'III' 의 인덱스는 [2] 까지 이므로 numArray[3] 이 없기때문에
} else {
result += numArray[i]
}
이 else를 실행시켜버리더라구요 그래서 원하는 값이 안나옵니다.
if (numArray[i] < numArray[i+1] && i < numAraay.length-1)
를 추가하거나
else if 를 사용해서
else if (i+1 == numArray.length){
result += numArray[i]
}
이렇게 하면 어떨까요?