본문 바로가기

Algorithm/Programers - C++

[프로그래머스] 옹알이(2)

 

Level. 1

 

문제

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다.
조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다.
문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 30
- 문자열은 알파벳 소문자로만 이루어져 있습니다.

 

풀이

#include <string>
#include <vector>
using namespace std;

int solution(vector<string> babbling) {
    int answer = 0;
    vector<string> words = {"aya", "ye", "woo", "ma"};
    for(int i = 0; i<babbling.size(); i++){
        string str = babbling[i];
        int pre_index = -1;
        for(int w_index = 0; w_index < words.size(); w_index++){
            string word = words[w_index];            
            if(word == str.substr(0, word.size())){
                if(w_index == pre_index) break;
                str = str.substr(word.size());
                pre_index = w_index;
                w_index = -1;
            }
        }
        if(str.size() == 0){
            answer ++;
        }
    }
    
    
    return answer;
}

 

해결방법

1. 조카 발음 단어 배열 words을 만든다.

2. 한 문장씩 words로 탐색하는 반복문을 돌린다. 

3. substr을 사용해 해당 문장 str가 words 중 한 단어로 시작할 경우를 찾고, 찾았을 경우 str의 맨 앞에서부터 해당 단어를 지운다. 

4. w_index는 당장 발음한 단어, pre_index는 직전 발음한 단어이다. 같은 발음을 하는 것을 어려워하므로 pre_index == w_index 이면 탐색을 멈춘다.

 

 

 


다른 풀이

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> babbling)
{
    int answer=0;

    for(string s : babbling)
    {
        int flag=0; bool j=true;
        for(int i=0; i<s.length(); i++)
        {
            if(s.substr(i,3)=="aya" && flag!=1) { flag=1; i+=2; }
            else if(s.substr(i,2)=="ma" && flag!=2) { flag=2; i+=1; }
            else if(s.substr(i,3)=="woo" & flag!=3) { flag=3; i+=2; }
            else if(s.substr(i,2)=="ye" && flag!=4) { flag=4; i+=1; }
            else { j=false; break; }
        }
        if(j==true) answer++;
    }

    return answer;
}

if 조건문에 s.substr 을 넣어 더 간결하다. 

따로 단어별로 배열을 생성하지 않았고, flag를 사용해 연속해서 같은 발음을 하는것을 체크할 수 있다.

가독성이 좋은 코드인 것 같다. 참고가 된다!

 


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

 

프로그래머스

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

programmers.co.kr