728x90
▶문제 : 코딩 테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 (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
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 약수의 개수와 덧셈 C언어 (0) | 2021.11.26 |
---|---|
프로그래머스 Level 1 : 음양 더하기 C언어 (0) | 2021.11.26 |
프로그래머스 Level 1 : 내적 C언어 (0) | 2021.11.26 |
프로그래머스 Level 1 : 소수만들기 C언어 (0) | 2021.11.26 |
프로그래머스 Level 1 : 로또의 최고 순위와 최저 순위 C언어 (0) | 2021.11.19 |
댓글