<Hard> Integer to English Words (LeetCode : C#)

이도희·2023년 6월 26일
0

알고리즘 문제 풀이

목록 보기
111/185
post-thumbnail

https://leetcode.com/problems/integer-to-english-words/

📕 문제 설명

양의 정수 주어질 때 영어 단어로 변환해서 반환

  • Input
    양의 정수
  • Output
    변환된 영어 단어

예제

풀이

구조를 보면 억, 백만, 천, 백의 자리 순으로 이루어져있으며 (몇) 억 + (몇백몇십몇) 백만 + (몇백볓십몇) 천 + (몇백몇십몇)으로 구성된다.

제일 앞의 값은 각 자릿수로 나눈 몫으로, 나머지 몇백몇십몇의 경우 해당 몫에서 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)

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글