programmers 1단계 옹알이[2]
Post

programmers 1단계 옹알이[2]

[level 1] 옹알이 (2) - 133499

문제 링크

성능 요약

메모리: 4.15 MB, 시간: 0.05 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 03월 25일 17:49:19

문제 설명

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


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

입출력 예
babblingresult
["aya", "yee", "u", "maa"]1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]2

입출력 예 설명

입출력 예 #1

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

입출력 예 #2

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

유의사항
  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.

※ 공지 - 2024년 2월 20일 문제 지문의 오탈자가 수정되었습니다.

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

풀이

진법 변환하고 변환 도중 인원*순서보다 string값이 커지면 변환을 종료하는식으로 메모리를 줄였다.

나의 정답 풀이

반복된 값들을 함수로 만들어야 했지만 귀찮아서 그냥 했다..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <string>
#include <vector>
#include <iostream>

using namespace std;

// a y w m 앞 글자가 나온다면 뒷글자를 확인 하는 방법으로 진행
// 반복 진행은 안된다.

int solution(vector<string> babbling) {
    int answer = 0;
    string aya = "aya", ye = "ye", woo = "woo", ma = "ma";
    
    for(auto n : babbling)
        for(int i=0;i<n.size();i++)
        {
            if (n[i] == 'a' && i + 2 < n.size()) {  // 'a'를 찾고 그 다음 문자가 존재하는지 확인
                string sub = n.substr(i, 3);
                if(sub == aya)
                {
                    i+=2;
                    if(i==n.size()-1) 
                    {
                        cout<<sub<<endl;
                        answer++;
                    }

                    if(n[i+1]=='a') 
                    {                   
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            if (n[i] == 'y' && i + 1 < n.size()) {  // 'a'를 찾고 그 다음 문자가 존재하는지 확인
                string sub = n.substr(i, 2);
                if(sub == ye)
                {                  
                    i+=1;
                    if(i==n.size()-1) 
                    {
                        cout<<sub<<endl;
                        answer++;
                    }
                    if(n[i+1]=='y') 
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            if (n[i] == 'w' && i + 2 < n.size()) {  // 'a'를 찾고 그 다음 문자가 존재하는지 확인
                string sub = n.substr(i, 3);
                if(sub == woo)
                {
                    i+=2;
                    if(i==n.size()-1) 
                    {
                        cout<<sub<<endl;
                        answer++;
                    }

                    if(n[i+1]=='w') 
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            if (n[i] == 'm' && i + 1 < n.size()) {  // 'a'를 찾고 그 다음 문자가 존재하는지 확인
                string sub = n.substr(i, 2);
                if(sub == ma)
                {
                    i+=1;
                    if(i==n.size()-1) 
                    {
                        cout<<sub<<endl;
                        answer++;
                    }
                    if(n[i+1]=='m') 
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            
        }
    return answer;
}

다른 사람 풀이

다른사람 풀이를 보니 특정 문자열이 나오면 공백으로 바꿔주고 만약 포문이 끝나고 공백이라면 answer++해주는 방법으로 효율성을 높였다. 코드 가독성을 높여야겠다..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <string>
#include <vector>

using namespace std;

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

    for(int i;i<babbling.size();i++)
    {
        string temp1="";
        string temp2="";
        for(char c:babbling[i])
        {
            temp1+=c;
            if(temp1 == "aya"||temp1 == "ye"||temp1 == "woo"||temp1 == "ma")
            {
                if(temp2 == temp1) break;
                temp2=temp1;
                temp1="";
            }
        }
        if(temp1.size()==0) answer++;
    }
    return answer;
}