LeetCode 13번 | 로마 숫자를 정수로 변환하기 (TypeScript 풀이)
이번 글에서는 LeetCode 13번 문제 "Roman to Integer" 를 TypeScript로 해결하는 방법을 다룹니다.
이 문제는 코딩 테스트나 개발자 면접에서 자주 등장하는 문자열 처리 & 수학적 규칙 적용 유형입니다.
🔹 문제 설명 (Roman to Integer)
로마 숫자는 다음과 같은 기호로 표현됩니다.
I = 1
,V = 5
,X = 10
,L = 50
,C = 100
,D = 500
,M = 1000
IV = 4
,IX = 9
,XL = 40
,XC = 90
,CD = 400
,CM = 900
처럼 작은 값이 앞에 오면 감산됩니다.
주어진 로마 숫자 문자열을 정수로 변환하는 함수를 구현해야 합니다.
🔹 풀이 전략
- 문자를 숫자로 변환하는 객체 (
symbol
맵) 생성 - 문자열을 순회하면서 현재 값과 이전 값을 비교
- 이전 값보다 크다면 감산(
-2 * prev
) 적용 - 그렇지 않다면 그대로 더하기
- 이전 값보다 크다면 감산(
- 최적화를 위해
symbol[c]
조회 최소화
🔹 TypeScript 풀이 코드
export function romanToInt(s: string): number {
const symbol: Record<string, number> = {
I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000,
};
let answer = 0;
let prev = 0;
for (const c of s) {
const value = symbol[c];
if (prev < value) {
answer -= prev * 2;
}
answer += value;
prev = value;
}
return answer;
}
✅ 시간 복잡도: O(n)
(문자열 한 번 순회)
✅ 공간 복잡도: O(1)
(고정된 크기의 symbol
맵 사용)
🔹 테스트 케이스
console.log(romanToInt("III")); // 3
console.log(romanToInt("IV")); // 4
console.log(romanToInt("IX")); // 9
console.log(romanToInt("LVIII")); // 58
console.log(romanToInt("MCMXCIV")); // 1994
🔹 결론 및 정리
이 문제는 문자열 순회와 조건 비교를 활용한 최적화가 핵심입니다.
처음에는 단순 덧셈을 고려할 수 있지만, 감산 규칙을 적용하기 위해 이전 값과 비교하는 방식이 필요합니다.
코딩 테스트나 면접에서 자주 등장하는 유형이므로, TypeScript로 직접 구현하면서 연습해보는 것이 중요합니다.
📌 이해가 안 되는 부분이나 더 좋은 풀이가 있다면 댓글로 공유해주세요! 😊
#LeetCode #코딩테스트 #알고리즘 #타입스크립트 #로마숫자 #RomanToInteger #개발자 #프로그래밍 #면접문제