넘치게 채우기

[LeetCode] 273. Integer to English Words 본문

PS/LeetCode

[LeetCode] 273. Integer to English Words

riveroverflow 2024. 8. 7. 11:10
728x90
반응형

https://leetcode.com/problems/integer-to-english-words/description/?envType=daily-question&envId=2024-08-07

leetcode - Integer to English Words

문제 유형 : 문자열 처리

문제 난이도 : Hard

 

문제

Convert a non-negative integer num to its English words representation.

음수가 아닌 정수 num을 영어 단어 표현으로 변환하여라.

 

풀이

num의 각 자릿수들을 저장하기 위해, 10짜리 크기의 배열을 만들어서 저장한다.

일의자릿수부터 잘라 넣어서, 역순으로 저장시켰다.

예제를 보다보면, 규칙을 알 수 있다.

바로, 세 자리 씩 끊어서 변환되어서 적절한 접미사 수식어를 붙이면 된다는 것이다.

 

그래서, 세 자리씩 변환한 문자열들에 "Thousand"와 같은 수식어를 붙인 것들을 각각 접합하면 된다.

세 자리 단위를 처리할 때, 십의 자리는 특이 케이스가 있다. eleven, twelve, -teen, -ty 등. 이를 적절히 처리해주면 된다.

 

코드

C++

#pragma GCC optimize("03", "unroll-loops");
static const int __ = [](){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    return 0;
}();

class Solution {
private:
    vector<string> numWords = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
    vector<string> teens = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
    vector<string> tys = {"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
public:
    string convert(int digit, vector<int>& nums) {
        string res = "";

        // 100
        if(nums[digit+2] != 0) {
            res += (numWords[nums[digit+2]] + " Hundred ");
        }

        // 0 ~ 99
        if(nums[digit+1] == 0) {
            res += numWords[nums[digit]];
            if(nums[digit]) res += " ";
        } else if(nums[digit+1] == 1) {
            res += teens[nums[digit]];
            res += " ";
        } else {
            res += tys[nums[digit+1]];
            if(nums[digit]) {
                res += " ";
                res += numWords[nums[digit]];
            }
            res += " ";
        }

        return res;
    }
    string numberToWords(int num) {
        if(num == 0) return "Zero";
        vector<int> nums;
        while(num > 0) {
            nums.push_back(num % 10);
            num /= 10;
        }
        while(nums.size() < 10) {
            nums.push_back(0);
        }
        string n = convert(6, nums);
        string m = convert(3, nums);

        string ans = (nums[9]? numWords[nums[9]] + " Billion ":"") + (n!=""? n + "Million ":"") + (m!=""? m + "Thousand ":"") + convert(0, nums);

        ans.pop_back();
        return ans;
    }
};
 
728x90
반응형