Leetcode Java Integer to English Words
업데이트:
문제
코드
class Solution {
private static String[] LOWER_THAN_20_WORDS = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };
private static String[] TEN_WORDS = { "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
public String numberToWords(int num) {
if (num == 0) {
return "Zero";
}
int hundreds = num % 1000;
num /= 1000;
int thousands = num % 1000;
num /= 1000;
int millions = num % 1000;
num /= 1000;
int billions = num;
StringBuilder sb = new StringBuilder();
if (billions > 0) {
this.hundredsToWord(billions, sb);
this.addSpace(sb);
sb.append("Billion ");
}
if (millions > 0) {
this.hundredsToWord(millions, sb);
this.addSpace(sb);
sb.append("Million ");
}
if (thousands > 0) {
this.hundredsToWord(thousands, sb);
this.addSpace(sb);
sb.append("Thousand ");
}
if (hundreds > 0) {
this.hundredsToWord(hundreds, sb);
}
return sb.toString().trim();
}
private void addSpace(StringBuilder sb) {
if (sb.length() - 1 != sb.lastIndexOf(" ")) {
sb.append(" ");
}
}
private void hundredsToWord(int num, StringBuilder sb) {
int tens = num % 100;
num /= 100;
if (num > 0) {
this.tensToWord(num, sb);
sb.append(" Hundred ");
}
if (tens > 0) {
this.tensToWord(tens, sb);
}
}
private void tensToWord(int num, StringBuilder sb) {
if (num < 20) {
sb.append(LOWER_THAN_20_WORDS[num]);
} else {
int tens = num / 10;
if (tens > 0) {
sb.append(TEN_WORDS[tens]).append(" ");
}
num %= 10;
if (num > 0) {
sb.append(LOWER_THAN_20_WORDS[num]);
}
}
}
}
결과
설명
-
주어진 정수 num을 영문자열로 변환하는 문제이다.
-
주어진 num이 0인 경우, “Zero”를 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 전역 변수를 정의한다.
- LOWER_THAN_20_WORDS은 20 미만의 숫자들을 영문자로 변경한 배열이다.
- TEN_WORDS는 10단위 숫자들을 영문자로 변경한 배열이다.
- 단, 20 미만의 영문자에 10이 포함되기 때문에 10 자리에는 ““으로 두었다.
- 문제 풀이에 필요한 10 단위를 영문자열로 변환하기 위한 tensToWord 메서드를 정의한다.
- num이 20 미만인 경우, LOWER_THAN_20_WORDS[num]의 영문자를 sb에 이어준다.
- num이 20 이상인 경우, 아래의 순서대로 진행한다.
- tens에 nums을 10으로 나눈 몫을 넣어 tens가 0 보다 큰 경우, TEN_WORDS[tens]의 영문자를 sb에 이어준다.
- num에 10으로 나눈 나머지 값을 넣고, num이 0 보다 큰 경우, LOWER_THAN_20_WORDS[num]의 영문자를 sb에 이어준다.
- 문제 풀이에 필요한 100 단위를 영문자열로 변환하기 위한 hundredsToWord 메서드를 정의한다.
- tens에 num을 100으로 나눈 나머지 값을 넣어주고, num에 100으로 나눈 몫을 넣어준다.
- num이 0 보다 큰 경우, num의 값으로 tensToWord 메서드를 수행하여 sb에 hundred 단위의 영문자를 이어준 후 “ Hundred “ 문자열을 이어준다.
- tens가 0 보다 큰 경우, tensToWord에 tens를 이용하여 sb에 10단위의 영문자를 이어준다.
- 문제 풀이에 필요한 sb의 앞 문자열에 “ “이 들어간 경우에 대한 예외 처리를 공통화 하기 위한 addSpace 메서드를 정의한다.
- 만일 sb의 마지막 위치인 $sb.length() - 1$에 공백(“ “)이 위치하지 않은 경우, 영문자열의 띄어쓰기 구분을 위해 sb에 공백(“ “)을 넣어준다.
- 문제 풀이에 필요한 변수를 정의한다.
- hundres, thousands, millions, billions에 차례대로 num을 1000으로 나눈 나머지 값을 넣어주고, num에 1000으로 나눈 몫을 넣어준다.
- 주어진 정수 num을 영문자열로 저장하기 위해 StringBuilder인 sb를 정의한다.
- 동적 문자열의 생성시, 효율적인 메모리 사용을 위해 StringBuilder를 사용한다.
- billions가 0 보다 큰 경우 아래를 수행하여 billion 단위의 영문자를 완성한다.
- billions의 값으로 hundredsToWord 메서드를 수행하여 sb에 billion 단위의 영문자를 이어준다.
- addSpace 메서드를 수행하여 문자열 간 띄어쓰기 규칙을 유지한다.
- sb에 “Billion “ 문자열을 이어주어 billion 단위의 영문자를 완성한다.
- millions가 0 보다 큰 경우 아래를 수행하여 million 단위의 영문자를 완성한다.
- millions의 값으로 hundredsToWord 메서드를 수행하여 sb에 million 단위의 영문자를 이어준다.
- addSpace 메서드를 수행하여 문자열 간 띄어쓰기 규칙을 유지한다.
- sb에 “Million “ 문자열을 이어주어 million 단위의 영문자를 완성한다.
- thousands가 0 보다 큰 경우 아래를 수행하여 thousand 단위의 영문자를 완성한다.
- thousands의 값으로 hundredsToWord 메서드를 수행하여 sb에 thousand 단위의 영문자를 이어준다.
- addSpace 메서드를 수행하여 문자열 간 띄어쓰기 규칙을 유지한다.
- sb에 “Thousand “ 문자열을 이어주어 thousand 단위의 영문자를 완성한다.
- hundreds가 0 보다 큰 경우 아래를 수행하여 hundred 단위의 영문자를 완성한다.
- hundreds의 값으로 hundredsToWord 메서드를 수행하여 sb에 hundred 단위의 영문자를 이어준다.
- addSpace 메서드를 수행하여 문자열 간 띄어쓰기 규칙을 유지한다.
- sb에 “Hundred “ 문자열을 이어주어 hundred 단위의 영문자를 완성한다.
- 8 ~ 11로 영문자열이 저장된 sb를 문자열로 전환 후 앞,뒤 공백을 제거하고 주어진 문제로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기