PS/Programmers

[Programmers Level1] 옹알이(2)(C++)

박땅콩 2022. 12. 1.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

프로그래머스

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

programmers.co.kr

 

 

[문제 설명]

 

 

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

 

 

[제한 사항]

 

 

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

 

 

[입출력 예]

 

 

babbling result
["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] 2

 

 

[입출력 예 설명]

 

 

입출력 예 #1

  • ["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

 

입출력 예 #2

  • ["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye" + "ma" + "woo" = "yemawoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return합니다.

 

[문제 풀이]

 

우선 조건은 조카가 "aya", "ye", "woo", "ma" 발음, 네가지 발음을 조합한 발음과 같은 단어를 연속적으로 발음할 수 없다.

 

내가 이 문제를 풀 때 사용한 알고리즘은

 

1. 문자열 배열 babbling의 각 원소(문자열)를 하나하나 확인한다.

 

2. 문자열의 각 문자를 확인하면서 길이가 2 또는 3일 때 발음 할 수 있는 발음인지 확인한다.

2-1. 발음할 수 있는 발음이라면,

문자열에서 해당 발음을 find로 찾고 길이가 2라면 "zz", 길이가 3이라면 "zzz"로 치환해준다.

그리고 이전 발음 했던 문자열 변수(beforeStr)에 발음한 문자열을 저장해준다.

2-2. 발음할 수 없는 발음이라면 1번으로 돌아간다.

 

3. 연속적으로 같은 발음을 할 수 없기 때문에 이전 발음 했던 문자열 변수(beforeStr)이 현재 확인한 발음과 같은지 확인한다.

3-1. 같은 발음이라면 1번으로 돌아간다. 

 

4. 1~2번을 모두 수행 후 문자열 배열 babbling을 확인한다.

4-1. 각 원소(문자열)를 확인했을 때 모두 문자가 'z'로 이루어졌다면 발음할 수 있는 발음으로 판단하여 answer를 1증가시켜준다. 

4-2. 각 원소(문자열)를 확인했을 때 모두 문자가 'z'로 이루어지지 않았다면 발음할 수 없는 발음으로 판단한다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/Programmers: Study Programmers for Coding Test

Study Programmers for Coding Test. Contribute to SmallPeanutPark/Programmers development by creating an account on GitHub.

github.com

 

 

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

using namespace std;

vector<string> p = {"aya", "ye", "woo", "ma"};

bool distinguishStr(string str) {
    for(int i = 0; i < str.length(); ++i) {
        if(str[i] != 'z') return false;
    }
    return true;
}

int solution(vector<string> babbling) {
    int answer = 0;
    int gSize = babbling.size();
    string beforeStr = "";
    for(int i = 0; i < gSize; ++i) {
        string s = babbling[i];
        string t = "";
        int gLen = babbling[i].length();
        int sLen = 0;
        beforeStr.clear();
        for(int j = 0; j < gLen; ++j) {
            t += s[j];
            sLen = t.length();
            if((sLen == 2) || (sLen == 3)) {
                if(beforeStr.compare(t) == 0) {
                    break;
                }
                
               if(t.compare(p[0]) == 0) {
                   beforeStr = p[0];
                   s.replace(s.find(p[0]), sLen, "zzz");
                   t.clear();
               } else if(t.compare(p[1]) == 0) {
                   beforeStr = p[1];
                   s.replace(s.find(p[1]), sLen, "zz");
                   t.clear();
               } else if(t.compare(p[2]) == 0) {
                   beforeStr = p[2];
                   s.replace(s.find(p[2]), sLen, "zzz");
                   t.clear();
               } else if(t.compare(p[3]) == 0) {
                   beforeStr = p[3];
                   s.replace(s.find(p[3]), sLen, "zz");
                   t.clear();
               } else {}
                
            }
            else if(sLen < 2) {
                continue;
            }
            else {
                // sLen > 3
                break;
            }
        }
        bool isSuccess = distinguishStr(s);
        if(isSuccess) answer += 1;
    }
    return answer;
}
728x90

댓글