[ LeetCode ] 12 Integer to Roman

codesver·2023년 6월 20일
0

LeetCode

목록 보기
3/24
post-thumbnail

📌 Problem

1이상 4000미만의 정수를 로마 숫자로 변환하면 되는 문제이다.

📌 Solution

만약 두 개의 문자를 합쳐서 생각할 수 없다면 이 문제는 굉장히 간단해진다. 가장 큰 로마 숫자인 M부터 시작하여 가장 작은 로마 숫자인 I까지 차례대로 나누기를 하였을 때 몫만큼 문자열을 만들면 된다. 예를 들어 3999는 1000 x 3 + 500 + 100 x 4 + 50 + 10 x 4 + 5 + 1 * 4로 나타낼 수 있다. 이를 로마 숫자로 나타내면 MMMDCCCCLXXXXVIIII이다.

하지만 로마 숫자에는 2개의 문자를 합쳐서 하나로 생각하는 경우가 있다. 그렇기 때문에 문제가 복잡하다고 느낄 수 있다. 그렇다면 그냥 2개의 문자도 하나의 경우의 수로 생각하면 된다. 즉, 다음과 같이 문자의 개수를 늘린다. M, CM, D, CD, C, XC, L, XL, X, IX, V, IV, I. 이제 하나의 문자만 있을 때와 마찬가지로 M부터 시작하여 I까지 차례대로 나누기를 하였을 때 몫만큼 문자열을 만들면 된다. (당연히 나누고 나서는 기존의 숫자를 나머지로 대체해야 한다.

📌 Code

class Solution {
    fun intToRoman(num: Int) = buildString {
        var value = num
        Roman.values().forEach { roman ->
            append(roman.toString().repeat(value / roman.value))
            value %= roman.value
        }
    }
}

enum class Roman(val value: Int) {
    M(1000), CM(900), D(500), CD(400), C(100), XC(90),
    L(50), XL(40), X(10), IX(9), V(5), IV(4), I(1)
}
profile
Hello, Devs!

0개의 댓글