로마자에서 숫자로 바꾸기
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
문제 분석
1. 로마자를 갈라서 배열에 넣기
2. 배열에 넣은 각 로마자를 숫자로 바꿔주기(switch이용) -> 배열에 넣기
3. 바꾼 숫자를 더해주기 -> reduce
function romanToNum(s) {
const arr = s.split("");
for(let i = 0; i < arr.length; i++){
switch(arr[i]){
case "I" : arr[i] = 1;
break;
case "V" : arr[i] = 5;
break;
case "X" : arr[i] = 10;
break;
case "L" : arr[i] = 50;
break;
case "C" : arr[i] = 100;
break;
case "D" : arr[i] = 500;
break;
case "M" : arr[i] = 1000;
break;
}
}
for(i=0;i<arr.length; i++){
if(arr[i]<arr[i+1]){
return arr.reduce((pre, cur) => pre + cur, 0)-arr[i]*2;
}else{
return arr.reduce((pre, cur) => pre + cur, 0);
}
}
}
는 실패!!ㅋㅋㅋㅋㅋㅋ
그래도 switch와 reduce를 써봤다는 것에 의의를 둔다;;;
그런데 다음날 이렇게 해보니 코드가 풀렸다.
let total = 0;
for(i=0;i<arr.length; i++){
if(arr[i-1]<arr[i]){
total += arr[i] - arr[i-1]*2
}else{
total += arr[i]
}
}
return total
하단의 for문-if문에서 리턴을 해버려 답이 안나왔던 것 같다.
total이라는 변수에 0을 할당하고 각 조건에 따라 배열의 요소를 더해주거나 빼주면 정상적으로 작동했다.
변수를 적극적으로 활용하고, 상황에 맞는 메서드를 사용하는 연습을 더 해야겠당!!
아래는 재상님의 코드
function romanToNum(s) {
const arr = s.split("");
console.log(arr)
let num = 0
for(let i = 0; i < arr.length; i++){
if(arr[i] === "I"){
if(arr[i+1]==="V" || arr[i+1] === "X"){
num -=2
}
num += 1;
}
if(arr[i] === "V"){
num += 5
}
if(arr[i]=== "X"){
if(arr[i+1]==="L" || arr[i+1] === "C"){
num -=20
}
num+= 10
}
if(arr[i]=== "L"){
num+= 50
}
if(arr[i]=== "C"){
if(arr[i+1]==="D" || arr[i+1] === "M"){
num -=200
}
num+= 100
}
if(arr[i]=== "D"){
num+= 500
}
if(arr[i]=== "M"){
num+= 1000
}
}
return num;
}
조건문 안에 조건문을 걸어주는 건 나한테 신박한 거라 많이 배웠다.
단순한 접근이 답으로 가는 지름길이라는 생각도 했다! 멋진 코드 감사합니다 재상님!!
function romanToNum(s) {
const roma= {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
total = 0;
for(let i = 0; i < s.length; i++){
if(total > 0 && roma[s[i]] > roma[s[i -1]]){
total += roma[s[i]] - roma[s[i-1]]*2
}else{
total += roma[s[i]]
}
}
return total
}