본문 바로가기
코드업(codeup)/C

[코드업(codeup)/C]코드업(codeup) 2024 : 숫자를 한글로 변환 C언어

by starfish22 2021. 11. 27.
728x90

▶문제 : 숫자를 한글로 변환 (codeup.kr)

 

숫자를 한글로 변환

양의 정수 n이 입력된다. ( 0 <= n <= 2,100,000,000)

codeup.kr

 

▶코드 작성(아래에 wchar_t 버전 있음)

#include <stdio.h>
#include <string.h>

int main()
{
    char num[9][4] = {
        "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"};
    char unit[9][4] = {
        "십", "백", "천", "", "십", "백", "천", "", "십"};
    char bUnit[2][4] = {"만", "억"};
    char string[30][4]; //숫자담는 문자열

    int n, i, temp, cUnit = 0, len = 0;

    scanf("%d", &n);

    if (n == 0)// 0일 때
    {
        printf("영");
        return 1;
    }

    while (n >= 1)
    {
        temp = n % 10;
        n /= 10;

        if (temp > 0) //0이 아닐 때
        {
            if (cUnit >= 4 && cUnit < 8) //"만"이 들어가야 될 때
            {
                strcpy(string[len++], bUnit[0]);
                strcpy(bUnit[0], ""); //한번만 넣기 위해
            }
            if (cUnit >= 8) //"억"이 들어가야 될 때
            {
                strcpy(string[len++], bUnit[1]);
                strcpy(bUnit[1], ""); //한번만 넣기 위해
            }
            if (cUnit > 0) //"십","백","천"이 들어가야 될 때
            {
                strcpy(string[len++], unit[cUnit - 1]);
            }
            strcpy(string[len++], num[temp - 1]); //"일","이",...숫자를 복사해서 넣음
        }
        cUnit++; //"십","백","천"이 들어가야 될 자리 구하는 변수
    }

    for (i = len - 1; i >= 0; i--)//거꾸로 출력
    {
        printf("%s", string[i]);
    }

    return 0;
}

위 코드는 정답용 코드로 바꾼 것이고 아래 wchar_t를 사용해 만든 코드가 처음 짠 코드인데 <locale.h> 헤더가 codeup에 안 먹혀서 다시 만들게 되었다...

 

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main()
{
    wchar_t num[9][2] = {
        L"일", L"이", L"삼", L"사", L"오", L"육", L"칠", L"팔", L"구"};
    wchar_t unit[9][2] = {
        L"십", L"백", L"천", L"", L"십", L"백", L"천", L"", L"십"};
    wchar_t bUnit[2][2] = {L"만", L"억"};
    wchar_t string[20]; //숫자 담는 문자열
    _wsetlocale(LC_ALL, L"Korean"); // wchar_t 문자열 한국어로 출력

    int n, i, temp, cUnit = 0;

    scanf("%d", &n);

    if (n == 0)// 0일 때
    {
        wprintf(L"영");
        return 1;
    }

    wcscpy(string, L"");//string 문자열을 아무것도 없는 상태로 초기화

    while (n >= 1)
    {
        temp = n % 10;
        n /= 10;

        if (temp > 0)//0이 아닐 때
        {
            if (cUnit >= 4 && cUnit < 8)//"만"이 들어가야 될 때
            {
                wcscat(string, bUnit[0]);
                wcscpy(bUnit[0], L"");//한번만 넣기 위해
            }
            if (cUnit >= 8)//"억"이 들어가야 될 때
            {
                wcscat(string, bUnit[1]);
                wcscpy(bUnit[1], L"");//한번만 넣기 위해
            }
            if (cUnit > 0)//"십","백","천"이 들어가야 될 때
            {
                wcscat(string, unit[cUnit - 1]);
            }
            wcscat(string, num[temp - 1]);//"일","이",...숫자를 복사해서 넣음
        }
        cUnit++;//"십","백","천"이 들어가야 될 자리 구하는 변수
    }

    for (i = wcslen(string) - 1; i >= 0; i--)//거꾸로 출력
    {
        wprintf(L"%c", string[i]);
    }

    return 0;
}

 

▶해석

숫자값 n을 받아 10으로 나누면서 몇 자릿수인지 체크하며 "십", "백", "천"을 붙이고 n을 10으로 나눈 나머지 값이 0이 아니면 "일", "이", "삼",... 이 들어가므로 구하여 붙인다. 만의 자릿수나 억이 넘어가면 한 번만 출력해야 되므로 한번 출력하는 즉시 "만" -> ""으로 복사하였다. 마지막으로 출력할 때는 string 문자열을 저장할 때 반대로 저장하였으므로 거꾸로 출력하여 정상적인 값을 출력한다.

728x90

댓글