1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요. 로마 숫자를 숫자로 표기하면 다음과 같습니다.
로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다. III = 3 XII = 12 XXVII = 27 입니다.
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
그런데 4를 표현할 때는 IIII가 아니라 IV 입니다. 뒤의 숫자에서 앞의 숫자를 빼주면 됩니다. 9는 IX입니다.
I는 V와 X앞에 와서 4, 9 X는 L, C앞에 와서 40, 90 C는 D, M앞에 와서 400, 900
function romanToNum(s) {
let result = 0;
const numObj = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };
// 1.이미 선언된 numObj에 해당하는 값이 있으면 그대로 반환.
if (numObj[s]) {
return numObj[s];
}
// 2.없으면 각 문자를 쪼개고, 해당하는 숫자로 변환하여 배열로 만듦.
const numArr = s.split('').map((el) => numObj[el]);
// 3. numArr와 numArr를 내림차순 한 결과가 같으면 numArr의 모든 요소를 더하여 반환함.
const sortArr = [...numArr].sort((a, b) => b - a);
if (numArr.join('') === sortArr.join('')) {
return numArr.reduce((acc, cur) => (acc += cur));
}
// 4. 3번이 아니라면, numArr을 역순으로 순회하면서 다 더해줌.
// !! 이때 순회하면서 해당 요소가 다음 요소보다 작으면, 그 수는 -1를 곱한 값으로 더함.
for (let i = 0; i < numArr.length; i += 1) {
if (numArr[i] < numArr[i + 1]) {
numArr[i] *= -1;
result += numArr[i];
continue;
}
result += numArr[i];
}
return result;
}
로마자를 넣으면 숫자가 나오는 문제인데,
숫자가 나오면 로마자가 리턴되는 문제인 줄 알았다.😭
다 풀고 나서야 알게 되었는데... 생각보다 단순한 문제였다ㅠㅠ
문제를 잘 읽자!!