로마자에서 숫자로 바꾸기

DongHee Kim·2021년 8월 23일
0

Algorithm

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


풀이

사고의 흐름

Step.1 : 입력값(로마자)을 숫자로 변환하기

// (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에 해당한다.
romeArrmap()을 적용해 배열값(로마자)이 객체 romeNum의 key(로마자)로 작용하는 value(숫자)를 배열 numArr에 담는다.

Step.2 : for문으로 양 옆의 값을 비교해 결과값 반환하기

//인접값끼리 비교해 값을 반환하는 반복문
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;
}

문제를 보면 로마자에 따라 반환값의 조건이 있다.

  • 로마자의 앞 값 >= 뒷 값 이면 앞 값 을 더한다.
    (ex. III = 3, XII = 12, XXVII = 27)
  • 로마자의 앞 값 < 뒷 값 이면 -앞 값 을 더한다.
    (ex. IV)

따라서 위 과정을 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문에서 잠시 무너졌었다.🤢 그래도 필요한 곳에 적절한 형태의 풀이 방법을 꺼내쓴 건 잘했다! 필요할 때 꺼내쓸 수 있는 패턴을 머릿속에 더 많이 저장하고자 다짐

profile
일상의 성실이 자존감을 만드는 성취주의자

0개의 댓글