코딩테스트/문제풀이

[220728] Level1_ 숫자 문자열과 영단어

Honey Badger 2022. 7. 29. 02:36

 

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

초기 아이디어

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;
}