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 |