오예 !!!
[프로그래머스] 숫자 문자열과 영단어 본문
문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 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;
}
영단어의 맨 앞 두 문자를 하나씩 비교하는 방식이라 코드를 작성할 때 많은 시간을 들여야 했고, 효율적이지도 않은 것 같다.
효율적인 방법을 기대하며 다른 사람의 풀이도 확인해보았으나, 위의 방식과 비슷하게 푼 사람들이 대부분이었다.
추후 시간이 좀 지나고 다른 사람들이 많이 풀었을 때 다시 확인해 볼 예정이다.
'🌟취준 > [코테 문풀] 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 음양 더하기 (0) | 2021.07.08 |
|---|---|
| [알고리즘 스터디] 알고리즘 풀이 압축 파일 (0) | 2021.07.08 |
| [프로그래머스] 소수 만들기 (0) | 2021.07.08 |
Comments