트랙
/
Arturo
Arturo
/
연습 문제
/
로마 숫자
로마 숫자

로마 숫자

보통

소개

오늘날 세계 대부분의 사람들은 아라비아 숫자(0–9)를 사용해요. 하지만 2천 년 전으로 거슬러 올라가 보면, 대부분의 유럽인들은 그 대신 로마 숫자를 사용하고 있었을 거예요.

로마 숫자를 쓰려면 다음과 같은 라틴 문자를 사용하는데, 각 문자에는 값이 있어요:

M D C L X V I
1000 500 100 50 10 5 1

로마 숫자는 이러한 문자를 나열한 것이고, 그 값은 각 문자가 가진 값의 합이에요. 예를 들어 XVIII의 값은 18이에요(10 + 5 + 1 + 1 + 1 = 18).

그런데 상황을 더 까다롭게 만드는 규칙이 하나 있어요. 바로 같은 문자를 연달아 세 번 넘게 사용할 수 없다는 점이에요. 그래서 4 같은 숫자는 겉보기에 자연스러워 보이는 IIII로 나타낼 수 없어요. 대신 그런 숫자에는 두 문자 사이의 뺄셈 방식을 사용해요. 즉, 4를 1 + 1 + 1 + 1이 아니라 5 - 1로 생각하는 거예요. 그리고 현대적인 사고방식에서는 조금 헷갈리게도, 더 작은 숫자를 먼저 써요. 이 방식은 다음 경우에만 적용돼요: 4(IV), 9(IX), 40(XL), 90(XC), 400(CD), 900(CM).

로마 숫자에서는 순서가 중요해요! 문자(그리고 위의 특별한 조합)는 왼쪽에서 오른쪽으로 값이 작아지는 순서로 배열해야 해요.

몇 가지 예를 살펴봐요:

 105 => CV
---- => --
 100 => C
+  5 =>  V
 106 => CVI
---- => --
 100 => C
+  5 =>  V
+  1 =>   I
 104 => CIV
---- => ---
 100 => C
+  4 =>  IV

그리고 마지막으로 좀 더 복잡한 예예요:

 1996 => MCMXCVI
----- => -------
 1000 => M
+ 900 =>  CM
+  90 =>    XC
+   5 =>      V
+   1 =>       I

지침

이번 과제는 아라비아 숫자를 로마 숫자로 변환하는 거예요.

이 연습 문제에서는 전통적인 로마 숫자만 다뤄요. 전통적인 로마 숫자에서 가장 큰 수는 MMMCMXCIX(또는 3,999)예요.

Note

아라비아 숫자와 로마 숫자를 변환하는 방법은 아주 많아요. 먼저 단순한 방식으로 로마 숫자의 개념에 익숙해진 다음, 더 효율적인 방법을 찾아보는 걸 추천해요.

어떤 접근법을 쓸 수 있는지 알아보고 싶다면, 마지막에 있는 Deep Dive 영상도 꼭 확인해 봐요!

Arturo 지침

이 연습 문제에서는 stringify 워드를 두 가지 방식으로 호출할 수 있도록 지원해야 해요:

  1. roman 속성을 사용하는 방식 (예: stringify.roman 3999)
  2. roman 속성을 사용하지 않는 방식 (예: stringify 3999)

더 자세한 내용은 attributes 문서와 attr 문서를 확인해 보세요.

Caution

attr 외에도 attrs 함수가 유용해요. 이 함수는 함수 호출의 모든 속성을 딕셔너리로 반환해요.

이 두 함수는 파괴적이라는 점을 주의하세요!

Arturo의 구현은 "attributes table"을 사용해요.

예를 들어 볼까요:

showAttributes: function [x][
    print attr 'question
    print attrs
    print attrs
]

showAttributes .question:"6 * 9" .answer:42 'arg

출력 결과는 다음과 같아요

6 * 9
[answer:42]
[]

이렇게 각 단계마다 속성 딕셔너리가 줄어드는 것을 볼 수 있어요.

결론: 속성은 한 번만 가져올 수 있다는 점을 알아 두세요. 속성을 다시 참조해야 한다면, 함수 시작 부분에서 속성을 저장해 두세요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Arturo Exercism

로마 숫자 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Arturo 트랙을 연습 문제 79개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.

로마 숫자 깊이 살펴보기!

재귀부터 표 기반 조회까지, 이 까다로운 문제에 대한 다양한 해법을 살펴봐요. 혼합 기수 숫자를 활용한 해법도 있고, Common Lisp으로 간단히 반칙하는 방법도 있어요.