210823 로마자에서 숫자로 바꾸기

박은정·2021년 8월 23일
0

문제

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

}

해설

  1. 로마자에 대해서 숫자를 구하기 위해 3번 로마자와 숫자를 객체형식으로 담고
    구하려는 숫자 (=각각의 로마자를 더한 총 합) 은 result라는 변수로 지정한다
const romeNum = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000 
}
 
let result = 0
// 나중에 로마자 하나하나를 더해서 result라는 변수에 담아주고
// result 값을 반환해주면 된다
  1. 입력한 로마자(=문자열,s)을 따옴표를 기준으로 쪼개서 배열로 만들어준다
    이러한 배열은 romeArray라는 변수에 담아준다
const romeArray = s.split('')
// ['I', 'V', 'I', 'I']
  1. 입력한 로마자(=문자열,s)의 요소를 하나씩 각각 로마자에 대한 숫자값으로 대체해준다.
    (각각의 요소를 객체 romeNum의 name값으로 찾음)
const numArray = romeArray.map(rome => romeNum[rome])
// [1, 5, 1, 1]

for문 대신에 map() 메서드를 이용한 이유

  1. 내가 지금 하려는 것
    → 배열에 있는 각각의 로마자를 숫자로 바꿔서 반환하고 싶은것이다
    (반환해줘야 나중에 또 사용할 수 있기 때문)
  2. for문을 이용하게 되면
    → for문은 반복적으로 실행만 해주는 것이기 때문에
    따로 return을 통해 반환처리도 해줘야 한다
  3. map() 메서드를 사용하게 되면
    → 해당하는 배열의 요소가 name인 value를 찾아주고, 그 value들을 다시 배열의 형태로 리턴해준다

내용 출처 : https://ljh86029926.gitbook.io/coding-apple-react/undefined/map

  1. 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문을 통해 이러한 연산을 구한다

  1. 구한 총 합 (=result)을 반환한다
return result
profile
새로운 것을 도전하고 노력한다

0개의 댓글