Code Kata #6 로마자 바꾸기

Somi·2021년 6월 28일
0

CODE KATA

목록 보기
6/12
post-thumbnail

💁 문제분석

로마자에서 숫자로 바꾸기
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
}

0개의 댓글

관련 채용 정보