[자바스크립트 알고리즘] 로마자에서 숫자로 바꾸기

이은진·2020년 12월 8일
4

알고리즘 공부

목록 보기
5/7

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

2. 풀이

for문으로 문자를 하나씩 확인하면서, 두 가지 경우만 고려하면 된다.

  1. 다음 로마문자에 해당하는 값이 지금 확인하는 로마문자보다 크다면, 지금 확인하는 로마문자의 값은 뺀다.
  2. 다음 로마문자에 해당하는 값이 지금 확인하는 로마문자보다 작거나 같다면, 지금 확인하는 로마문자의 값은 더해준다.

먼저 로마문자에 대한 값을 차례로 배열로 만들어주고, 인자로 받은 문자 's'를 숫자로 대체하기 위해 split('')으로 배열을 만들어준다. 그리고 배열로 만들어 준 's'를 엘리먼트 하나씩 돌면서 로마문자에 대한 숫자값으로 대체해준다.
그리고 for문으로 대체한 숫자값 배열의 엘리먼트를 하나씩 돌면서, 위에 언급한 두 가지 경우를 고려하여 연산을 수행한다.

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

console.log(romanToNum('III')) // 3
console.log(romanToNum('XII')) // 12
console.log(romanToNum('XXVII')) // 27
console.log(romanToNum('MCMXCIV')) // 1994
profile
빵굽는 프론트엔드 개발자

1개의 댓글

comment-user-thumbnail
2021년 8월 12일

안녕하세요^^ 반갑습니다. 자스를 시작한지 얼마 안 자린이 입니다^^
for (i=0; i<numArray.length; i++) {
if (numArray[i] < numArray[i+1] ) {
result -= numArray[i]
} else {
result += numArray[i]
}
이 부분에서,
예를들어서, console.log(romanToNum('III')) 라고 한다면
i=2 이 되는 순서가 오게되면
numArray[i] < numArray[i+1] 가
numArray[2] < numArray[3] 이 되버립니다.
'III' 의 인덱스는 [2] 까지 이므로 numArray[3] 이 없기때문에
} else {
result += numArray[i]
}
이 else를 실행시켜버리더라구요 그래서 원하는 값이 안나옵니다.

if (numArray[i] < numArray[i+1] && i < numAraay.length-1)
를 추가하거나

else if 를 사용해서
else if (i+1 == numArray.length){
result += numArray[i]
}
이렇게 하면 어떨까요?

답글 달기