https://school.programmers.co.kr/learn/courses/30/lessons/81301
초기 아이디어
1. 10크기의 배열에 순서대로 one, two...nine의 문자열이 저장되어 있다고 가정. (string A[10])
2. for문으로 배열0~9까지 각각 참조, if 인자로 받은 문자열에 배열요소 중 같은 부분이 있다면 해당 i를 string으로 변환.
3. find로 반환된 index는 replace에 인자로 전달, A[i].size만큼 잰 다음 변환한 i(string)으로 replace 시킨다.
4. 위의 과정이 모두 끝난 문자열 tempStr을 int로 변환하여 함수 리턴.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
string NUM[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
for (int i = 0; i < 10; i++)
{
if (s.find(NUM[i]) != string::npos)
{
s.replace(s.find(NUM[i]), NUM[i].length(), to_string(i));
}
}
answer = stoi(s);
return answer;
}
오류&해결
테스트5,7,8을 통과하지 못해 찾아보니 동일한 문자열이 여러개 나오는 경우 ex)"twotwo83two" 올바른 결과를 도출하지 못하는 것을 확인했다. 그래서 for문 안에 if문으로 한번만 검사하는 것이 아니라 while로 NUM[i]문자가 전부 replace될때까지 반복을 돌렸다. 또한 find함수가 두번 호출되는 부분을 수정하여 효율성과 가독성을 높였다.
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
int findResult = -1;
string NUM[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
for (int i = 0; i < 10; i++)
{
while( (findResult = s.find(NUM[i]) ) != string::npos)
{
s.replace(findResult, NUM[i].length(), to_string(i));
}
}
answer = stoi(s);
return answer;
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[220806] Level_ 1 2016년 (0) | 2022.08.06 |
---|---|
[220805] Level_ 1 완주하지 못한 선수 (오답노트) (0) | 2022.08.05 |
[220803] Level1_ 로또의 최고 순위와 최저 순위 (0) | 2022.08.03 |
[220801] Level1_ 체육복 (0) | 2022.08.03 |
[220730] Level2_ 멀쩡한 사각형 (0) | 2022.07.31 |