본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 1 : 숫자 문자열과 영단어 C언어

by starfish22 2021. 11. 19.
728x90

▶문제 : 코딩 테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

▶코드 작성(개선 코드 밑에 있음)

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

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int solution(const char *s)
{
    char str[10][6] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    char number[50] = {0}, temp;
    int i, j, m, leng = 0;
    int answer = 0;

    for (i = 0; i < strlen(s); i++)
    {
        temp = s[i];
        if (temp >= '0' && temp <= '9')
        {
            number[leng++] = temp;
        }
        else
        {
            for (j = 0; j < 10; j++)
            {
                if (strncmp(s + i, str + j, 3) == 0)
                {
                    temp = j + '0';
                    number[leng++] = temp;
                    i += strlen(str[j]) - 1;
                    break;
                }
            }
        }
    }

    m = 1;//자리수 나누기
    for (i = strlen(number) - 1; i >= 0; i--, m *= 10)
    {
        answer += (number[i] - '0') * m;
    }

    return answer;
}

 

근데 자리수 나누는 부분이 뭔가 비효율적이므로 다듬어보았다

▶개선 코드

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

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int solution(const char *s)
{
    char str[10][6] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    //배열 자리마다 알맞은 수 선언
    int i, j;
    int answer = 0;

    for (i = 0; i < strlen(s); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')//문자가 '0'~'9' 일 때
        {
            answer *= 10;
            answer += s[i] - '0';//문자 상수이므로 '0'을 빼줌
        }
        else
        {
            for (j = 0; j < 10; j++)
            {
                if (strncmp(s + i, str + j, 3) == 0)//최소 글자수 3
                {
                    answer *= 10;
                    answer += j;//배열의 자리(j)가 str[j] 이므로
                    i += strlen(str[j]) - 1;//빠르게 찾기 위해 str[j]의 글자수-1 만큼 앞당김
                    break;
                }
            }
        }
    }

    return answer;
}

 

▶해석

if문으로 문자열(s)에서 숫자가 쓰여있는지 글자가 써있는지 구분한 후 answer에 더해간다. answer 변수는 0으로 초기화된 상태이므로 10을 먼저 곱한 후 숫자를 더해주고 그것을 반복한다면 알맞은 자리로 들어가게 된다

728x90

댓글