https://leetcode.com/problems/integer-to-english-words/
양의 정수 주어질 때 영어 단어로 변환해서 반환
구조를 보면 억, 백만, 천, 백의 자리 순으로 이루어져있으며 (몇) 억 + (몇백몇십몇) 백만 + (몇백볓십몇) 천 + (몇백몇십몇)으로 구성된다.
제일 앞의 값은 각 자릿수로 나눈 몫으로, 나머지 몇백몇십몇의 경우 해당 몫에서 1000으로 나눈 나머지로 계산할 수 있다.
public class Solution {
private string[] ones =
{
"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"
};
private string[] tens =
{
"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
};
public string NumberToWords(int num)
{
if (num == 0) return "Zero";
string billionsStr = ProcessNums(num/(int)Math.Pow(10, 9)); // 억단위
string millionsStr = ProcessNums((num/(int)Math.Pow(10, 6)) % 1000); // 백만자리 단위
string thousandsStr = ProcessNums((num/1000) % 1000); // 천 단위
string hundreds = ProcessNums(num);
StringBuilder sb = new StringBuilder();
if (!string.IsNullOrEmpty(billionsStr)) sb.Append(billionsStr + " Billion ");
if (!string.IsNullOrEmpty(millionsStr)) sb.Append(millionsStr + " Million ");
if (!string.IsNullOrEmpty(thousandsStr)) sb.Append(thousandsStr + " Thousand ");
if (!string.IsNullOrEmpty(hundreds)) sb.Append(hundreds);
return sb.ToString().Trim();
}
private string ProcessNums(int num) // 몇백몇십몇 계산
{
StringBuilder sb = new StringBuilder();
int hundreds = (num/100) % 10;
if (hundreds >= 1)
{
sb.Append(ones[hundreds] + " Hundred");
}
if (num % 100 < 20) // 십의 자리 수가 20 미만이면 ones 배열에서 찾기
{
sb.Append(" ");
sb.Append(ones[num%100]);
}
else // 이상이면 10의 자리수 처리 후 ones 붙이기
{
sb.Append(String.Format(" {0} {1} ", tens[(num/10)%10], ones[num%10]));
}
return sb.ToString().Trim();
}
}
(시간 의미 x)