오예 !!!

[프로그래머스] 숫자 문자열과 영단어 본문

🌟취준/[코테 문풀] 프로그래머스

[프로그래머스] 숫자 문자열과 영단어

당도최고치악산복숭아 2021. 7. 9. 00:35

문제 설명

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

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

 


제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

  • 정확성 테스트 : 10초

내 풀이

str[i]가 정수면 바로 answer_str에 추가하였고, 정수가 아니라면 영단어라는 의미이기에 영단어의 맨 앞 두 글자를 비교하여 각각에 대응하는 정수를 answer_str에 추가하는 방식으로 문제를 해결하였다.

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

// 문자열 str에서 원래 숫자 찾는 함수
int conversion(char str[], int str_len){
    char answer_str[str_len]; // 영단어를 숫자로 변환하여 저장할 문자열
    answer_str[0] = '\0'; // 문자열 비우기
    int idx = 0; // answer_str의 인덱스
    
    char first_two_char[2]; // 영단어의 맨 앞 두글자를 복사할 문자열
    
    for(int i = 0; i < str_len; i++){
        if(isdigit(str[i])){ // str[i]가 정수인 경우
            answer_str[idx++] = str[i]; // answer_str에 붙이기
        }
        else{ // str[i]가 char인 경우
            first_two_char[0] = str[i]; // 영단어의 맨 앞 첫번째 문자
            first_two_char[1] = str[i + 1]; // 영단어의 맨 앞 두번째 문자
            
            if(strcmp(first_two_char, "ze") == 0){ // "zero"인 경우
                answer_str[idx++] = '0'; // answer_str에 "0" 붙이기
                i += 3; // i 값 조절
            }
            else if(strcmp(first_two_char, "on") == 0){ // "one"인 경우
                answer_str[idx++] = '1'; // answer_str에 "1" 붙이기
                i += 2;
            }
            else if(strcmp(first_two_char, "tw") == 0){ // "two"인 경우
                answer_str[idx++] = '2'; // answer_str에 "2" 붙이기
                i += 2;
            }
            else if(strcmp(first_two_char, "th") == 0){ // "three"인 경우
                answer_str[idx++] = '3'; // answer_str에 "3" 붙이기
                i += 4;
            }
            else if(strcmp(first_two_char, "fo") == 0){ // "four"인 경우
                answer_str[idx++] = '4'; // answer_str에 "4" 붙이기
                i += 3;
            }
            else if(strcmp(first_two_char, "fi") == 0){ // "five"인 경우
                answer_str[idx++] = '5'; // answer_str에 "5" 붙이기
                i += 3;
            }
            else if(strcmp(first_two_char, "si") == 0){ // "six"인 경우
                answer_str[idx++] = '6'; // answer_str에 "6" 붙이기
                i += 2;
            }
            else if(strcmp(first_two_char, "se") == 0){ // "seven"인 경우
                answer_str[idx++] = '7'; // answer_str에 "7" 붙이기
                i += 4;
            }
            else if(strcmp(first_two_char, "ei") == 0){ // "eight"인 경우
                answer_str[idx++] = '8'; // answer_str에 "8" 붙이기
                i += 4;
            }
            else { // "nine"인 경우
                answer_str[idx++] = '9'; // answer_str에 "9" 붙이기
                i += 3;
            }
        }
    }
    
    return atoi(answer_str); // char to int 후 반환
}

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int solution(const char* s) {
    int answer = 0;
    
    int str_len = strlen(s); // 문자열 s의 길이
    char str[str_len];
    strcpy(str, s); // 문자열 s를 str에 복사
    
    answer = conversion(str, str_len); // 원래 숫자 찾는 함수 호출
    
    return answer;
}

영단어의 맨 앞 두 문자를 하나씩 비교하는 방식이라 코드를 작성할 때 많은 시간을 들여야 했고, 효율적이지도 않은 것 같다.

 

효율적인 방법을 기대하며 다른 사람의 풀이도 확인해보았으나, 위의 방식과 비슷하게 푼 사람들이 대부분이었다.

 

추후 시간이 좀 지나고 다른 사람들이 많이 풀었을 때 다시 확인해 볼 예정이다.

Comments