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
문제에서는 로마자를 계산하는 방법이 뒤에서부터 앞으로 연산해서
예를 들어 'IVII'
란 로마자를 숫자로 변환한다고 하면
원래는 뒤에서부터 1 + 1 + 5 - 1
로 계산을 해주는 것이 맞지만
이 연산은 - 1 + 5 + 1 + 1
이것과 동일하고
해당하는 숫자가 뒤에 나오는 숫자보다 작으면 더하는게 아니라 빼고
그외로는 해당하는 숫자를 더하면 된다
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 = result - numArray[i]
} else {
result = result + numArray[i]
}
}
return result
}
3번
로마자와 숫자를 객체형식으로 담고const romeNum = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
let result = 0
// 나중에 로마자 하나하나를 더해서 result라는 변수에 담아주고
// result 값을 반환해주면 된다
romeArray
라는 변수에 담아준다const romeArray = s.split('')
// ['I', 'V', 'I', 'I']
const numArray = romeArray.map(rome => romeNum[rome])
// [1, 5, 1, 1]
for문 대신에 map() 메서드를 이용한 이유
- 내가 지금 하려는 것
→ 배열에 있는 각각의 로마자를 숫자로 바꿔서 반환하고 싶은것이다
(반환해줘야 나중에 또 사용할 수 있기 때문)- for문을 이용하게 되면
→ for문은 반복적으로 실행만 해주는 것이기 때문에
따로 return을 통해 반환처리도 해줘야 한다- map() 메서드를 사용하게 되면
→ 해당하는 배열의 요소가 name인 value를 찾아주고, 그 value들을 다시 배열의 형태로 리턴해준다내용 출처 : https://ljh86029926.gitbook.io/coding-apple-react/undefined/map
for문을 이용해서 배열의 처음부터 끝까지 확인을 할건데,
지금 확인하는 숫자
< 그 숫자 다음에 나오는 숫자
=> 총 합
에 지금 확인하는 숫자
를 빼고총 합
에 지금 확인하는 숫자
를 더한다for (i = 0; i < numArray.length; i++) {
if (numArray[i] < numArray[i + 1]) {
result = result - numArray[i]
}
else {
result = result + numArray[i]
}
}
result = 0 으로 시작했다가
i=0
, result = 0 - 1
i=1
, result = -1 + 5
i=1
, result = 4 + 1
i=2
, result = 5 + 1
for문
을 통해 이러한 연산을 구한다
result
)을 반환한다return result