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



Programmers - [2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어




사용 언어 - C++

소요 시간 - 약 35분




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/81301




문제 요약

  1. 0~9로 이루어진 숫자를 랜덤하게 문자열로 바꾸어 제공 ex) 1478 → one4seveneight
  2. 문자열을 각 해당하는 수로 치환하여 return




최종 코드

#include <string>
#include <vector>
#include <regex>

using namespace std;

int solution(string s) {
    int answer = 0;
    vector<string> number = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
    
    //one4seveneight -> 1478로 바꾸기
    //바꾸는 방법? regex_replace와 regex를 사용하여 정규식 비교
    
    for(int i = 0; i < number.size(); i++)
    {
        s = regex_replace(s, regex(number[i]), to_string(i));
    }
    
    //숫자를 리턴
    answer = stoi(s);
    return answer;
}




트러블 슈팅

  • regex는 사용할 수 없는 함수라는 에러가 발생 → regex 헤더 포함
  • regex_replace가 정상적인 인수를 할당받지 못했다는 에러 발생 → regex_replace의 마지막 인수를 int형으로 넘겼기 때문에 발생한 문제 → i를 to_string 함수를 통해 문자열로 전달
  • 코드 실행 단계에서는 정상적으로 작동했지만 채점 과정에서 abort / segmentation fault가 발생하는 문제점이 생김
    • regex_replace를 s의 size만큼 하려고 했기 때문에 정상적인 결과 값을 얻지 못하고 에러가 발생 → s.size()를 number.size()로 변경




해결 과정

  1. 처음에는 문자열을 어떻게 쪼개야 할까를 고민
  2. 다른 코테 문제를 풀다가 사용해봤던 regex와 regex_replace를 떠올림
  3. 이 두 가지를 사용하면 굳이 문자열을 쪼개지 않아도 바로 문자열을 치환할 수 있겠다는 생각을 하고 문제 해결




문제 풀이 후 소감

  • 어떤 새로운 함수를 쓸 때는 꼭 내가 그 헤더를 포함 시켰는지를 확인하자
  • 해당 함수를 사용할 때는 그 함수가 어떤 파라미터를 요구하는지 잘 확인하자
  • 문제를 푸는 단계에서 배열의 크기를 잘 고려하자. 아니면 abort나 segmentation fault 오류가 발생할 가능성이 높음