code kata

Se-Yong Yun·2021년 5월 3일
0

algorithm

목록 보기
1/2
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

💡풀이

function romanToNum(s) {
  const rome ={
  I : 1,
  V : 5,
  X : 10,
  L : 50,
  C : 100,
  D : 500,
  M : 1000
  }
  let converted = 0
  for(let i=0;i<s.length;i++) {
    if(rome[s.[i]]<rome[s.[i+1]]) {
      converted -= rome[s.[i]]
    } else {
      converted += rome[s.[i]]
    }
  }
  return converted 
}

description

예외가 되는 경우(4,9,40,90...) 따로 정의하는 것도 가능하지만 좀 더 근본적인 해결을 하고자 했다.

예를들어, 'MCDLXIV'라는 숫자를 보자.
M+(CD)+L+C+(IV) = 1000+400+50+10+4 = 1464이다. 괄호안의 CD와 IV가 문제풀이의 핵심이 되는 부분이라고 볼 수 있다. MCDLXIV의 배열을 보면 모두 앞에서부터 내림차순으로 알파벳이 정렬 되어 있는데C, I만 정렬을 벗어나있다. 즉, 오름차순을 벗어나서 존재하는 알파벳들이 음수로 더해지는 알파벳임을 알수 있다.

따라서 전체 로직의 방향은, '오름차순에서 벗어난 알파벳만 음수를 곱해서 더하고 나머지는 그대로 더한다.' 로 진행했다.

0개의 댓글