문제 링크
https://leetcode.com/problems/integer-to-roman/
풀이
전체적인 풀이 과정은 다음과 같다.
- 주어진 수에 대해 1000의 자릿수에 대해 개수를 카운트해 문자 formatting
- 그 하위 숫자들에 대해선 경우의 수 (0~3, 4, 5~8, 9)를 구분지어 문자를 formatting할 수 있는 함수를 통해 문자열 생성
단순 주어진 문자를 이어 붙이는게 아닌, 로마 숫자 특성상 특정 숫자를 기준으로 왼쪽으로 수를 붙이는 경우도 있어, 이를 대체하기 위해선 일일히 경우의 수를 나누어 문자열을 만드는 것이 편하다.
주어진 숫자가 최대 3999정도기 때문에 1000의 자릿수의 경우엔 별 다른 경우 없이 'M' 문자를 단순 나열하면 된다. 하지만 하위 100, 10, 1의 자리의 경우 다양한 경우가 주어지기 때문에 이에 맞는 각각의 패턴을 다루는 함수를 통해 각 자릿수의 값에 대해 문자열을 반환받으면 된다.
class Solution {
public String intToRoman(int num) {
int remainder = num, quotient;
StringBuilder sb = new StringBuilder();
quotient = remainder / 1000;
remainder = remainder - quotient * 1000;
for (int i = 0; i < quotient; i++) {//1000의 자리 formatting
sb.append('M');
}
quotient = remainder / 100;
remainder = remainder - quotient * 100;
sb.append(formatting(quotient, 'C', 'D', 'M'));//100의 자리 formatting
quotient = remainder / 10;
remainder = remainder - quotient * 10;
sb.append(formatting(quotient, 'X', 'L', 'C'));//10의 자리 formatting
sb.append(formatting(remainder, 'I', 'V', 'X'));//1의 자리 formatting
return sb.toString();
}
String formatting(int count, char formatFor1, char formatFor5, char formatFor10) {//특정 대역의 포메팅 함수
StringBuilder sb = new StringBuilder();
if (count <= 3) {
for (int i = 0; i < count; i++) {
sb.append(formatFor1);
}
} else if (count == 4) {
sb.append(formatFor1);
sb.append(formatFor5);
} else if (count < 9) {
sb.append(formatFor5);
for (int i = 0; i < count - 5; i++) {
sb.append(formatFor1);
}
} else {
sb.append(formatFor1);
sb.append(formatFor10);
}
return sb.toString();
}
}
결과
'Algorithm > 코드 풀이' 카테고리의 다른 글
LeetCode: 39번 (Combination Sum) [JAVA] (0) | 2022.08.30 |
---|---|
LeetCode: 22번 (Generate Parentheses) [JAVA] (0) | 2022.08.30 |
LeetCode: 9번 (Palindrome Number) [JAVA] (0) | 2022.08.23 |
LeetCode: 70번 (Climbing Stairs) [JAVA] (0) | 2022.07.12 |
LeetCode: 55번 (Jump Game) [JAVA] (0) | 2022.07.12 |