Javascript에서 로마 숫자 함수 작성

문제 설명



주어진 숫자의 로마 숫자를 반환하는 알고리즘을 작성하십시오.

예시:

roman(5) => V


해결책



먼저 숫자를 로마 숫자에 매핑하는 방법이 필요합니다.

이를 위해 간단한 개체를 사용할 수 있습니다. 우리가 매핑하는 숫자는 IV 형식(1 before 5)으로 작성된 가장 중요한 숫자 및 일부 숫자(예: 4)입니다.

키가 숫자이고 값이 해당 숫자인 객체는 다음과 같습니다.

const NUMERALS = {
    M: 1000,
    CM: 900,
    D: 500,
    CD: 400,
    C: 100,
    XC: 90,
    L: 50,
    XL: 40,
    X: 10,
    IX: 9,
    V: 5,
    IV: 4,
    I: 1
}


끝 문자열에 추가할 숫자의 양을 결정하려면 개체의 각 숫자가 인수에 들어가는 횟수를 확인하고 필요한 경우 로마 숫자 문자열에 추가해야 합니다.

입력 숫자 15를 사용하는 예를 살펴보겠습니다.
  • 객체의 숫자 1000에서 40은 숫자 15에 포함되지 않으므로 여기서는 아무 일도 일어나지 않습니다. (eg. 15 / 100) = 0
  • 루프가 개체에서 값 10에 도달하면 15를 10으로 나누어 1.5를 얻습니다. 따라서 숫자 10은 15에 한 번 들어가므로(15 / 10 = 1.5) 로마 숫자 문자열에 'X'를 추가합니다.
  • 그런 다음 15에서 10을 빼고 루프를 계속 진행해야 5가 남습니다. 이제 개체의 값을 사용하여 계산하는 데 사용되는 숫자는 5입니다.
  • 개체의 다음 반복에서는 숫자가 추가되지 않도록 값 95/9 = 0.0...를 사용합니다.
  • 개체의 다음 속성에 도달하면 값은 5입니다. 따라서 5로 나누고 문자열에 'V'를 추가한 다음 빼면 0이 남습니다.
  • 루프가 개체의 마지막 속성을 계속 반복합니다. 그러나 더 이상 숫자가 추가되지 않습니다.

  • 알고리즘 작성



    1 단계:

    빈 문자열 변수를 선언하고 개체의 모든 키를 반복하는 루프 블록을 작성합니다.

    var str = '';
    for (var i of Object.keys(NUMERALS)) {
        ...   
    }
    


    2 단계:

    루프 내에서 전달된 숫자를 각 숫자 값으로 나누어야 합니다.

       var q = Math.floor(number / NUMERALS[i]);
    


    여기서 Math.floor() 함수는 숫자가 내림되도록 합니다.

    3단계:
    q는 숫자 값이 인수에 들어가는 횟수이므로 숫자 값을 곱하고 숫자에서 빼야 합니다. 예를 들어 루프에서 개체의 숫자 값 10을 사용하고 인수가 35인 경우:

    var q = Math.floor(35/10) = 3;
    number = 35 - (3 * 10) = 5;
    


    따라서 다음 문장은 다음과 같습니다.

    number -= q * NUMERALS[i];
    


    4단계:

    마지막으로 3단계q의 예를 사용하여 인수에서 값이 발생하는 횟수를 로마 숫자에 추가합니다. 따라서 문자열에 XXX를 추가해야 합니다.

    str += i.repeat(q);
    


    모두 끝났습니다!

    완성된 함수는 다음과 같습니다. for 루프 외부에서 우리는 단순히 전체 문자열을 반환하여 완료합니다.

    function roman (number) => {
        var str = '';
        for (var i of Object.keys(NUMERALS)) {
            var q = Math.floor(number / NUMERALS[i]);
            number -= q * NUMERALS[i];
            str += i.repeat(q);
        }
    
        return str;
    }
    


    다음 단계:


  • 숫자 입력만 허용하도록 유형 검사를 추가하고 양수만 허용하도록 조건을 추가하여 기능을 더욱 강력하게 만드십시오.
  • 이 함수에 대한 테스트를 작성합니다.

  • 읽어 주셔서 감사합니다 :)

    연결:


  • https://en.wikipedia.org/wiki/Roman_numerals
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
  • 좋은 웹페이지 즐겨찾기