## 문제 [Integer to Roman - LeetCode](https://leetcode.com/problems/integer-to-roman) ## 코드 ### Greedy 항상 현재 수보다 크지 않은 로마 숫자 값을 빼가며 기호를 이어 붙이는 방식 - 시간 복잡도: O(1) - 공간 복잡도: O(1) (결과 생성을 위한 배열은 제외함) ```typescript function intToRoman(num: number): string { const symbolTable = new Map([ [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"], ]); const valueIter = symbolTable.keys(); let answer: string[] = []; let currValue = valueIter.next().value; while (num > 0) { while (currValue > num) { currValue = valueIter.next().value; } const currSymbol = symbolTable.get(currValue)!; answer.push(currSymbol); num -= currValue; } return answer.join(""); } ``` Map 말고 다른 자료구조를 생각하지 못해서 숫자를 순회하기 위해서 iterator를 썼는데, 다 풀고 생각해보니 iterator는 가독성 측면에서 썩 좋지 않은 것 같다. 여기서는 탐색 구간이 겹치는 부분이 없기 때문에 배열 기반으로 했어도 괜찮았을 것 같음 ```typescript function intToRoman(num: number): string { const symbols = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]; const values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]; let answer: string[] = []; for (let idx = 0; idx < values.length; idx++) { const value = values[idx]; const cnt = Math.floor(num / value); if (cnt <= 0) continue; const symbol = symbols[idx]; answer.push(symbol.repeat(cnt)); num %= value; } return answer.join(''); }; ```