반응형
[LeetCode] Integer to Roman - 탐욕법(Greedy) 활용한 숫자 변환
📌 문제 설명
LeetCode의 "Integer to Roman" 문제는 주어진 정수를 로마 숫자로 변환하는 문제입니다.
- 입력: 정수 num
- 출력: 해당 정수를 로마 숫자로 변환한 문자열
🔹 로마 숫자 기본 규칙
숫자 로마 숫자
1 | I |
5 | V |
10 | X |
50 | L |
100 | C |
500 | D |
1000 | M |
✅ 일반적인 로마 숫자는 큰 값부터 작은 값 순서로 표현됩니다.
예) 58 → LVIII (50 + 5 + 3)
🔹 예외 규칙 (뺄셈 적용)
숫자 로마 숫자 설명
4 | IV | I는 V 앞에서 4 의미 |
9 | IX | I는 X 앞에서 9 의미 |
40 | XL | X는 L 앞에서 40 의미 |
90 | XC | X는 C 앞에서 90 의미 |
400 | CD | C는 D 앞에서 400 의미 |
900 | CM | C는 M 앞에서 900 의미 |
✅ 특정 숫자(4, 9, 40, 90, 400, 900)는 작은 숫자가 큰 숫자 앞에 와서 뺄셈 역할을 합니다.
📌 해결 방법 (탐욕법 - Greedy Algorithm)
💡 핵심 아이디어
- 큰 숫자부터 차례대로 변환해야 하므로 탐욕법(Greedy Algorithm) 활용
- 큰 숫자부터 하나씩 확인하며 num에서 해당 값을 빼면서 로마 숫자 추가
- 숫자가 0이 될 때까지 반복
✅ 코드 구현 (O(N) 복잡도)
export function intToRoman(num: number): string {
// 1️⃣ 큰 값부터 매칭할 수 있도록 배열을 생성
const romanMap: [number, string][] = [
[1000, "M"],
[900, "CM"],
[500, "D"],
[400, "CD"],
[100, "C"],
[90, "XC"],
[50, "L"],
[40, "XL"],
[10, "X"],
[9, "IX"],
[5, "V"],
[4, "IV"],
[1, "I"],
];
let result = "";
// 2️⃣ 큰 값부터 순회하면서 숫자를 변환
for (const [value, symbol] of romanMap) {
while (num >= value) {
result += symbol; // 3️⃣ 해당 로마 숫자를 추가
num -= value; // 4️⃣ 숫자를 감소
}
}
return result;
}
📌 예제 실행 과정
입력: num = 1994
- 1994 >= 1000 → M 추가 → num = 994
- 994 >= 900 → CM 추가 → num = 94
- 94 >= 90 → XC 추가 → num = 4
- 4 >= 4 → IV 추가 → num = 0
✅ 출력: "MCMXCIV"
📌 테스트 코드
describe("Integer to Roman", () => {
it("converts numbers correctly", () => {
expect(intToRoman(3)).toEqual("III");
expect(intToRoman(58)).toEqual("LVIII");
expect(intToRoman(1994)).toEqual("MCMXCIV");
});
});
✅ 모든 테스트 케이스 통과! 🚀

📌 시간 복잡도 분석
연산 복잡도 설명
탐욕법 (Greedy Algorithm) | O(N) | 숫자가 0이 될 때까지 최대 13번 반복 |
✅ 탐욕법을 활용하면 O(N)으로 최적화 가능! 🚀
📌 최종 정리
- 큰 숫자부터 차례대로 로마 숫자로 변환해야 함 → 탐욕법 사용
- 큰 값부터 매칭하는 배열을 만들고, 현재 숫자가 크면 반복해서 뺀다.
- O(N) 시간 복잡도로 효율적으로 해결 가능!
💡 이제 유사한 문제에서도 "큰 값부터 탐욕적으로 처리하는 방식"을 고려해 보세요! 🚀
#LeetCode #IntegerToRoman #알고리즘 #TypeScript #탐욕법
반응형
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode 42] Trapping Rain Water - 효율적인 해결 방법 (Two Pointers) (0) | 2025.03.17 |
---|---|
[LeetCode 134] Gas Station - 탐욕법(Greedy)으로 해결하기 (0) | 2025.03.13 |
[LeetCode 238] Product of Array Except Self - 나누기 없이 배열 곱셈 구하기 (0) | 2025.03.12 |
[LeetCode 380] Insert Delete GetRandom O(1) - 효율적인 데이터 구조 구현 (Set vs. Array + Map) (0) | 2025.03.11 |
[LeetCode 274] H-Index - 연구 논문의 영향력 측정 (탐욕법 + 정렬) (0) | 2025.03.10 |