코딩테스트

[leetcode] 12. Integer to Roman

nayoon 2024. 7. 19. 20:54

1. 현타오도록 복잡하게 푸는 방법..

 

/**

    1. 숫자를 로마 숫자로 바꿔서 리턴하면 된다.
    가장 큰 단위부터 왼쪽 -> 오른쪽으로 구성하면 되고
    3000을 나타낼때 1000을 MMM 쓰는 것처럼 10자리만 여러번 쓸 수 있고 5, 50, 500의 경우는 여러번 쓸 수 없음

    2.
    3000 -> 1000이 3개 -> MMM
    700 -> 500이 1개, 200이 2개 -> DCC
    40 -> XL (subtractive form)
    9 -> IX (subtractive form)

    50 -> L
    8 -> 5가 1개, 3이 세개 -> VIII
    
    1000 -> 1000이 1개 -> M
    900 -> CM
    90 -> XC
    4 -> IV

    3. 10의 자리부터 나누기
    1 -> 10 -> 100 -> 1000
    StringBuilder에 합쳤다가 reverse해서 값 반환

    5이상인지 확인하고 9이면 IX
    4이면 IV

    50이상인지 확인하고 90이면 XC
    40이면 XL

    500이상인지 확인하고 900이면 CM
    400이면 CD

    3999까지만 등장하기 때문에 4000에 대한 고려는 안해도 된다.
 */
class Solution {
    public String intToRoman(int num) {
        int power = 1;
        StringBuilder sb = new StringBuilder();
        while(num > 0) {
            int cond = num % 10;
            sb.append(roman(cond, power));
            num /= 10;
            power += 1;
        }

        return sb.reverse().toString();
    }

    public String roman(int cond, int power) {
        StringBuilder sb = new StringBuilder();
        if (power == 1) {
            if (cond == 9) {
                return "XI";
            }
            else if (cond == 4) {
                return "VI";
            } else {
                if (cond >= 5) {
                    sb.append("V");
                    cond -= 5;
                }
                for(int i = 0; i < cond; i++) {
                    sb.append("I");
                }
                return sb.reverse().toString();
            }
        } else if (power == 2) {
            if (cond == 9) {
                return "CX";
            }
            else if (cond == 4) {
                return "LX";
            } else {
                if (cond >= 5) {
                    sb.append("L");
                    cond -= 5;
                }
                for(int i = 0; i < cond; i++) {
                    sb.append("X");
                }
                return sb.reverse().toString();
            }
        } else if (power == 3) {
            if (cond == 9) {
                return "MC";
            }
            else if (cond == 4) {
                return "DC";
            } else {
                if (cond >= 5) {
                    sb.append("D");
                    cond -= 5;
                }
                for(int i = 0; i < cond; i++) {
                    sb.append("C");
                }
                return sb.reverse().toString();
            }
        } else {
            for(int i = 0; i < cond; i++) {
                sb.append("M");
            }
            return sb.reverse().toString();
        }
    }
}

 

2. 간단한 방법

 

3999까지밖에 안나오기 때문에 아래와 같이 데이터를 가지고 있는 게 훨씬 간단하다.

class Solution {
    public String intToRoman(int num) {
        int[] intVal = new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] strVal = new String[] {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i <strVal.length; i++) {
            String s = strVal[i];
            while(num >= intVal[i]) {
                sb.append(s);
                num -= intVal[i];
            }
        }
        
        return sb.toString();
    }
}

'코딩테스트' 카테고리의 다른 글

[leetcode] 14. Longest Common Prefix  (0) 2024.08.01
[leetcode] 189. Rotate Array  (0) 2024.07.27
[leetcode] 13. Roman to Integer  (0) 2024.07.19
[leetcode] 27. Remove Element  (0) 2024.07.18
[leetcode] 394. Decode String  (0) 2024.07.13