문제 설명
문제 설명: 로마 숫자는 다음의 일곱 가지 다른 기호로 표현됩니다: I, V, X, L, C, D, M. 기호 값 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 예를 들어, 숫자 2는 로마 숫자로 II로 쓰이며, 이는 단순히 1이 두 번 더해진 것입니다. 숫자 12는 XII로, 이는 X + II입니다. 숫자 27은 XXVII로, 이는 XX + V + II입니다. 로마 숫자는 일반적으로 왼쪽에서 오른쪽으로 큰 값에서 작은 값 순으로 씁니다. 그러나 숫자 4는 IIII로 쓰지 않고 IV로 씁니다. 이는 1이 5 앞에 있어 4가 되도록 빼기 때문입니다. 같은 원리가 숫자 9에도 적용되어 IX로 씁니다. 다음의 여섯 가지 경우에 빼기가 사용됩니다: I는 V(5)와 X(10) 앞에 놓여 4와 9를 만듭니다. X는 L(50)과 C(100) 앞에 놓여 40과 90을 만듭니다. C는 D(500)와 M(1000) 앞에 놓여 400과 900을 만듭니다. 주어진 로마 숫자를 정수로 변환하세요.
예제
예제 1
예제 2
예제 3
예제 4
예제 5
예제 6
⚠️제약 조건
- •
1 <= s.length <= 15
- •
s는 ('I', 'V', 'X', 'L', 'C', 'D', 'M') 문자들만 포함합니다.
- •
s가 [1, 3999] 범위 내의 유효한 로마 숫자임이 보장됩니다.
해결 방법
🎯접근 방식
이 문제는 문자열을 순회하면서 로마 숫자의 규칙에 따라 값을 계산하는 방식으로 해결됩니다. 주어진 로마 숫자를 각 문자에 대응하는 정수 값으로 변환한 후, 현재 값이 다음 값보다 작으면 빼고 그렇지 않으면 더하는 방식으로 전체 값을 계산합니다. 핵심 아이디어는 로마 숫자의 특수한 뺄셈 규칙을 활용하여 순차적으로 값을 계산하는 것입니다.
솔루션 코드
복잡도 분석
O(n) - 문자열 `s`의 길이에 비례하여 각 문자를 순회하며 변환 작업을 수행하므로, 전체적으로 선형 시간 복잡도를 가집니다.O(1) - 고정된 크기의 `symbolMap`과 상수 크기의 추가 변수만 사용하므로, 입력 크기와 무관하게 공간 복잡도는 상수입니다.💡상세 설명
이 문제에서는 로마 숫자를 정수로 변환하는 알고리즘을 구현해야 합니다. 로마 숫자는 특정 규칙에 따라 작성되며, 이 규칙을 이해하는 것이 중요합니다. 이 코드의 핵심 아이디어는 로마 숫자의 각 문자를 정수로 변환하고, 특수한 경우(예: IV, IX 등)에는 뺄셈을 적용하여 최종 결과를 얻는 것입니다.
알고리즘의 핵심 아이디어
로마 숫자는 일반적으로 큰 값에서 작은 값 순서로 나열되지만, 특정 경우에는 작은 값이 큰 값 앞에 위치하여 뺄셈을 나타냅니다. 예를 들어, IV는 4를 나타내며 이는 5(V)에서 1(I)을 뺀 것입니다. 이 알고리즘은 이러한 규칙을 이용하여 문자열을 순회하면서 각 문자를 정수로 변환하고, 다음 문자를 확인하여 뺄셈이 필요한 경우를 처리합니다.
코드의 주요 로직 설명
-
symbolMap객체: 로마 숫자 문자를 정수로 변환하기 위한 매핑을 제공합니다. 각 로마 문자('I', 'V', 'X', 등)는 그에 해당하는 정수 값으로 매핑됩니다. -
romanToInt함수: 주어진 로마 숫자 문자열s를 정수로 변환합니다.- 문자열
s를 각 문자로 나누어 배열로 만듭니다. - 각 문자를
symbolMap을 사용하여 정수로 변환합니다. - 변환된 정수 배열을 순회하면서, 현재 값이 다음 값보다 작으면 뺄셈을, 그렇지 않으면 덧셈을 수행하여 결과를 계산합니다.
- 문자열
각 단계별 동작 과정
-
문자열 분할 및 변환:
s.split('')를 통해 문자열을 문자 배열로 분리합니다.map(c => symbolMap[c])를 사용하여 각 문자를 대응하는 정수로 변환합니다.
-
정수 배열의 합산:
reduce함수를 사용하여 배열을 순회합니다.- 현재 값
cur가 다음 값numbers[i + 1]보다 작으면acc - cur로 계산하여 뺄셈을 수행합니다. - 그렇지 않으면
acc + cur로 계산하여 덧셈을 수행합니다. - 이 과정을 통해 전체 문자열에 대한 정수 값을 계산합니다.
핵심 변수들의 역할
symbolMap: 로마 숫자 문자를 정수로 변환하는 데 사용됩니다.numbers: 로마 숫자 문자열을 정수 배열로 변환한 결과를 저장합니다.acc:reduce함수 내에서 누적된 합계를 저장합니다.cur: 현재 처리 중인 정수 값을 나타냅니다.
왜 이 방법이 효과적인지
이 방법은 로마 숫자의 기본 규칙과 특수한 뺄셈 규칙을 모두 고려하여 효율적으로 문자열을 정수로 변환합니다. reduce 함수를 사용하여 한 번의 순회로 모든 계산을 처리하므로 시간 복잡도가 O(n)으로 매우 효율적입니다. 또한, symbolMap을 사용하여 문자에서 정수로의 변환을 빠르게 수행할 수 있습니다. 이러한 점에서 이 알고리즘은 간결하면서도 효과적으로 문제를 해결합니다.