Code Kata

강지원·2021년 10월 25일
0
post-thumbnail

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. 최종 코드

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

3. 풀이 과정

예전에 풀어봤던 객체의 key 값을 공유해 해결하는
문제와 비슷한 유형이었다.
이번 문제는 주어진 인자를 객체와 매칭시켜 나오는 값으로
숫자를 계산하는 흐름이었다.

3-1) 문제를 풀며 놓쳤던 부분

  1. 가장 까다로웠던 부분이 조건을 맞춰주는 부분이었는데,
    인자로 받은 값이 문자열이라 그대로 length를 사용해줘도
    되는데도 불구하고 split('')을 해주거나
    객체의 key 값과 매칭시키는 데에도 시간이 꽤나 걸렸다.
  1. 로마 문자의 순서에 따라 숫자 계산이 어떻게 되는지
    문제를 풀 당시에 파악하지 못했다.
    XI 와 IX를 예시로 이해하려 해봤다.

  1. let result = '';
    결과값이 도출되는 부분에 공백을 줬던 것.
    공백으로 줬을 시엔 문자열로 계속 합산 또는 감산되어
    수가 더해지거나 빼지지 않고 데이터가 들어왔다.

이 때까지만 하더라도 데이터가 원하던 대로
들어오지 않는 이유를 명확히 파악하지 못했다.

결과값을 0으로 줬을 경우엔 합산, 감산이 이뤄져
원하던 값을 얻을 수 있었다.

profile
'Why' better than 'Yes'

0개의 댓글

관련 채용 정보