새로운 날이 밝았다! 2주차를 맞아 코드카타 짝을 바꾸고 다시 새로운 마음으로 새로 짝이 된 동기분과 1일차 코드 카타를 진행해보았다.
로마자에서 숫자로 바꾸기
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
# Code
### 1st code
```javascript
// 로마자 -> 숫자
const roman = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
function romanToNum(s) {
let result = 0;
const arr = s.split('');
const keys = Object.keys(roman); // 객체의 키
const values = Object.values(roman); // 객체의 값
// s를 split한 배열의 값이 키의 value와 일치할 때 해당 values[i]의 값으로 로마자를 숫자로 변환시킨다.
const changeNum = arr.map((el) => {
for (let i in keys) {
if (el === keys[i]) {
return values[i]
}
}
});
// 배열 안의 요소 중 이전 요소보다 다음 요소가 더 크다면 result -= changeNum[i] 크지 않다면 result += changeNum[i]
for (let i = 0; i < changeNum.length; i++) {
if (changeNum[i] < changeNum[i+1]) {
result -= changeNum[i];
} else {
result += changeNum[i];
}
}
return result;
}
const roman = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
function romanToNum(s) {
let result = 0;
const changeNum = s.split('').map((el) => roman[el]);
for (let i = 0; i < changeNum.length; i++) {
if (changeNum[i] < changeNum[i+1]) {
result -= changeNum[i];
} else {
result += changeNum[i];
}
}
return result;
}
roman[el]
으로 작성하면 roman 객체의 키 값에 해당하는 값으로 로마자를 숫자로 변환한 배열을 만들 수 있다.