링크: https://school.programmers.co.kr/learn/courses/30/lessons/81301?language=cpp

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

1. 문제 접근

이 문제는 숫자가 영어 단어와 숫자 형태로 섞여 있는 문자열을 실제 숫자로 변환하는 문제이다. 예를 들어 다음과 같은 문자열이 들어온다.

  • "one4seveneight"
  • "23four5six7"
  • "2three45sixseven"

핵심은 영어 단어를 => 숫자로 바꾸는 것이다. 영단어는 다음과 같이 구성된다.

영단어 숫자

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

이 문제는 크게 두 가지 방식으로 해결할 수 있다.

  1. 문자열을 한 글자씩 직접 확인하면서 변환 - 1번 풀이
  2. regex_replace()를 사용하여 문자열 치환 - 2번풀이
    (참고)정규표현식 regex란?

2. 풀이 (2개)

  • 1번 풀이 (직접 문자열 비교)
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int solution(string s) {
        string answer = "";
        string temp ="";
    
        vector <string> v = {
            "zero", "one" ,"two" ,"three" ,"four",
            "five","six", "seven","eight","nine"
        };
    
        for(int i=0 ; i<s.size() ; i++){
    
            // 숫자인 경우 => 바로 answer에 저장
            if(s[i]>='0' && s[i]<= '9'){
                answer += s[i];
            }
    
            // 영단어인 경우 => temp에 누적
            else {
                temp += s[i];
    
                for(int j=0; j<v.size() ; j++){
    
                    if(temp == v[j]){ // 완성된 영단어 나오면 숫자로 변환
                        answer += to_string(j);
                        temp ="";
                    }
                }
            }
        }
    
        return stoll(answer);
    }
    • 풀이 설명
      이 방법은 문자열을 한 글자씩 읽으면서 직접 판단하는 방식이다. 예를 들어 "one4seveneight"가 들어오면 다음처럼 동작한다.
      temp = "o"
      temp = "on"
      temp = "one"
      
      //이때 "one"은 v[1]과 같으므로
      answer += "1";
      을 수행한다
      
      - 숫자는 바로 저장- 완성된 영단어가 나오면 숫자로 변환
      - 문자는 temp에 누적


  • 2번 풀이(regex 사용)
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <regex>
    
    using namespace std;
    
    vector<string> numbers = {
        "zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine"
    };
    
    int solution(string s) {
    
        regex r; // 정규 표현식 변수선언(패턴 저장하는 변수)
    
        for(int i = 0; i < numbers.size(); i++) {
    
            r = numbers[i]; //패턴 정보
            s = regex_replace(s, r, to_string(i)); //
        }
    
        return stoi(s);
    }
     
    • 풀이 설명
      이 방법은 문자열 치환 함수(regex_replace)를 사용하는 방식이다.
      //예를 들어
      s = "one4seveneight"
      
      s = regex_replace(s, regex("one"), "1");
      
      s = "14seveneight"
      
      - 이 작업을 "zero"부터 "nine"까지 반복하면 최종적으로 숫자 문자열만 남게 된다.
        (참고)숫자를 문자열로 변환(123 => "123") to_string() 함수

 

 

3. 문법 설명

  • regex_replace()
    특정 문자열을 다른 문자열로 바꾸는 함수이다
    regex_replace(문자열, 정규표현식, 바꿀문자열)
    
    regex_replace(s, regex("one"), "1")
    
    "one" → "1"
    

4. 최종 요약

풀이 특징
직접 구현 풀이 문자열 처리 원리를 이해하기 좋음
regex 풀이 코드가 짧고 간단함


핵심 아이디어는 다음과 같다.

  1. 숫자는 그대로 저장
  2. 영단어는 숫자로 변환
  3. 마지막에 문자열을 숫자로 변환

문자열 처리 문제에서는

  • stoi(): string -> int
  • to_string(): int -> string
  • regex_replace() -> 치환

+ Recent posts