로마자에서 숫자로 바꾸기
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) 로마자:숫자 객체 변수는 romeNum
const romeNum = {
'I' : 1,
'V' : 5,
'X' : 10,
'L' : 50,
'C' : 100,
'D' : 500,
'M' : 1000
}
// (2) 로마자를 한 글자씩 배열로 만든다
const romeArr = s.split('');
// (3) 입력값을 로마자 -> 숫자로 변환한다.
const numArr = romeArr.map(num => romeNum[num]);
(1) 주어진 로마자 : 숫자
조합을 romeNum
객체에 넣어 두었다.
(2) 입력값(로마자)이 s라면, split
을 이용해 한 글자씩 분리된 로마자 배열romeArr
을 만들어두었다.
(3) 한 글자씩 분리된 로마자(romeArr
의 값)는 romeNum
객체의 key에 해당한다.
romeArr
에 map()
을 적용해 배열값(로마자)이 객체 romeNum
의 key(로마자)로 작용하는 value(숫자)를 배열 numArr
에 담는다.
//인접값끼리 비교해 값을 반환하는 반복문
let result = 0;
for (let i=0; i<numArr.length; i++){
if(numArr[i]<numArr[i+1]){
result -= numArr[i];
} else {
result += numArr[i]
}
}
return result;
}
문제를 보면 로마자에 따라 반환값의 조건이 있다.
따라서 위 과정을 for문을 통해 반복하면, 정답이 반환된다!
이 부분이 참 까다로웠는데, 뒷 값이 더 큰 예제(IV 등)를 통해 실제로 진행해보며 이해할 수 있었다.
function romanToNum(s) {
//로마자:숫자 객체 변수는 romeNum
const romeNum = {
'I' : 1,
'V' : 5,
'X' : 10,
'L' : 50,
'C' : 100,
'D' : 500,
'M' : 1000
}
//로마자를 한 글자씩 배열로 만든다
//text배열 : romeArr
const romeArr = s.split('');
//입력값을 나눠서 로마자 -> 숫자로 변환한다.
// 숫자배열 : numArr
const numArr = romeArr.map(num => romeNum[num]);
//인접값끼리 비교해 값을 반환하는 반복문
let result = 0;
for (let i=0; i<numArr.length; i++){
if(numArr[i]<numArr[i+1]){
result -= numArr[i];
} else {
result += numArr[i]
}
}
return result;
}
배열의 i번째 값과 (i+1)번째 값을 비교하며 새로운 값을 반환하는 형태의 풀이가 자주 보인다. 이번 풀이에도 해당 형태를 떠올리긴 했지만, 까다로운 조건이 있는 탓에 for문에서 잠시 무너졌었다.🤢 그래도 필요한 곳에 적절한 형태의 풀이 방법을 꺼내쓴 건 잘했다! 필요할 때 꺼내쓸 수 있는 패턴을 머릿속에 더 많이 저장하고자 다짐