본문 바로가기

CodingTest/99클럽2024스터디

99클럽 코테 스터디 3일차 TIL, 프로그래머스 / 숫자 문자열과 영단어

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

static string zero  = "zero";
static string one   = "one";
static string two   = "two";
static string three = "three";
static string four  = "four";
static string five  = "five";
static string six   = "six";
static string seven = "seven";
static string eight = "eight";
static string nine  = "nine";

// string_view 를 사용한 이유는 substr 함수에서 새로운 string 복사본을 만들지 않기 위함.
int compare(string_view sv, int& cnt)
{
    if (sv.size() >= 4 && sv.substr(0, 4) == zero)      {cnt = 4; return 0;}
    if (sv.size() >= 3 && sv.substr(0, 3) == one)       {cnt = 3; return 1;}
    if (sv.size() >= 3 && sv.substr(0, 3) == two)       {cnt = 3; return 2;}
    if (sv.size() >= 5 && sv.substr(0, 5) == three)     {cnt = 5; return 3;}
    if (sv.size() >= 4 && sv.substr(0, 4) == four)      {cnt = 4; return 4;}
    if (sv.size() >= 4 && sv.substr(0, 4) == five)      {cnt = 4; return 5;}
    if (sv.size() >= 3 && sv.substr(0, 3) == six)       {cnt = 3; return 6;}
    if (sv.size() >= 5 && sv.substr(0, 5) == seven)     {cnt = 5; return 7;}
    if (sv.size() >= 5 && sv.substr(0, 5) == eight)     {cnt = 5; return 8;}
    if (sv.size() >= 4 && sv.substr(0, 4) == nine)      {cnt = 4; return 9;}
    
    return 0;
}

int solution(string s) {
    int str_size = s.size();
    int cur_idx = 0;
    int answer = 0;
    string_view sv = s;
    
    while(cur_idx < str_size)
    {
        char cur_char   = s[cur_idx];
        int cur_num     = cur_char - '0';
        
        if (cur_num <= 9) 
        {
           answer = 10 * answer + cur_num; 
            cur_idx += 1;
        }
        else
        {
            int part_cnt = 0, sum_cnt = 0;
            int prev_idx = cur_idx;
            cur_idx += 1;
            
            // 문자 X 곳 까지 idx 를 증가
            while (cur_idx < str_size && sv[cur_idx] - '0' > 9) cur_idx += 1;
            
            // 문자열 추출
            string_view part_sv = sv.substr(prev_idx, cur_idx - prev_idx);
            
            sum_cnt = part_sv.size();
            
            while(sum_cnt > 0)
            {
               int part_num = compare(part_sv, part_cnt);
                answer      = 10 * answer + part_num;
                sum_cnt     -= part_cnt;
                part_sv     = part_sv.substr(part_cnt);
            }
        }
    }
    
    return answer;
}