Home [C# 프로그래머스] 옹알이(1)
Post
Cancel

[C# 프로그래머스] 옹알이(1)

문제 링크

 프로그래머스

1. 문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 “aya”, “ye”, “woo”, “ma” 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

2. 접근법

“aya”,”ye”,”woo”,”ma” 로 조합할 수 있는 모든 단어를 찾는다는 것은 불가능하기도 하고 비효율적이라고 생각해서 다른 방법으로 접근했다.

접근한 방법은 “yewooma” 라는 문자열이 주어진다면, 새로운 문자열 A에다 “yewooma”의 앞단어부터 하나씩 넣어준다.

그리고 A가 “aya”,”ye”,”woo”,”ma”가 될 때, A를 string.Empty 시켜준다.

“yewooma” 문자열의 끝까지 탐색을 마쳤을 때 문자열 A가 Empty라면, “yewooma”는 “aya”,”ye”,”woo”,”ma” 로 구성된 단어임을 알 수 있다.

오답인 경우도 봐보자.

예를 들어, “yewoomaa” 라는 문자열이 주어진다면,
“ye”,”woo”와 “ma” 까지는 문자열 A가 계속 Empty 상태가 되겠지만, 마지막 “a”는 A에 남게 된다.
그러므로, 탐색 종료 후 A가 Empty가 아니게 됨으로 “aya”,”ye”,”woo”,”ma”로 구성된 단어가 아님을 알 수 있다.

3. 제한 사항

제한 사항 중에 가장 중요한 내용은 아래의 내용이라 생각한다.

babbling의 각 문자열에서 “aya”, “ye”, “woo”, “ma”는 각각 최대 한 번씩만 등장합니다.즉, 각 문자열의 가능한 모든 부분 문자열 중에서 “aya”, “ye”, “woo”, “ma”가 한 번씩만 등장합니다.

“aya”,”ye”,”woo”,”ma”가 문자열에서 “한 번씩” 등장하기 때문에

Dictionary<string, bool> 를 사용해 사용된 단어(Key)의 Value를 false에서 true로 바꾸어 한 번씩 사용되도록 하였다.

4. 코드

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
static int solution(string[] babbling)
{
    int answer = 0;

    Dictionary<string, bool> canWords = new Dictionary<string, bool>()
    {
        { "aya",false },
        {"ye",false },
        {"woo",false },
        {"ma",false }
    };

    Action initDictionary = () =>
    {
        canWords["aya"] = false;
        canWords["ye"] = false;
        canWords["woo"] = false;
        canWords["ma"] = false;
    };

    string word;
    foreach (var babb in babbling)
    {
        initDictionary();
        word = string.Empty;

        foreach (var b in babb)
        {
            word += b;

            if(canWords.TryGetValue(word, out bool result))
            {
                if (!result)
                {
                    result = true;
                    word = string.Empty;
                }
            }
        }

        if (string.IsNullOrEmpty(word))
            answer += 1;
    }

   return answer;
}

1

This post is licensed under CC BY 4.0 by the author.