C# 프로그래밍 기초 실습 전자책

C# / .NET 알고리즘과 퀴즈
본 알고리즘 퀴즈 문제는 C#/.NET 개발자를 위한 알고리즘 인터뷰 혹은 C# 프로그래밍을 통한
문제 해결 알고리즘을 연구해 보는데 도움이 되고자 작성되었습니다.


퀴즈 질문


예상답변/설명

각 숫자를 순서대로 방문하여 숫자가 같을 경우 카운터를 증가시키고, 다른 경우 카운터를 결과에 추가한 후 카운터를 리셋, 다음 문자를 계속 체크한다.

static void Main(string[] args)
{
    string num = 1.ToString();
    Console.WriteLine(num);
    for (int i = 0; i < 10; i++)
    {                
        num = LookAndSay(num);
        Console.WriteLine(num);
    }
}
static string LookAndSay(string s)
{
    StringBuilder result = new StringBuilder();
    char curr = default(char);
    int count = 0;

    foreach(char ch in s)
    {
        if (ch != curr)
        {
            if (curr == default(char))
            {
                curr = ch;
                count = 1;
                result.Append(curr);
            }
            else
            {
                result.Append(count.ToString());
                curr = ch;
                count = 1;
                result.Append(curr);
            }
        }
        else
        {
            count++;
        }
    }
    result.Append(count);
    return result.ToString();
}

그리고 다음과 같은 Recursive 방식을 생각해 볼 수도 있다.

static string LookAndSayRecursive(string s)
{
    if (string.IsNullOrEmpty(s)) return "";
    if (s.Length == 1) return s[0] + "1";

    if (s[s.Length - 1] != s[s.Length - 2])
    {
        return LookAndSayRecursive(s.Substring(0, s.Length - 1)) 
               + s[s.Length - 1] + "1";
    }
    else
    {
        string r = LookAndSayRecursive(s.Substring(0, s.Length - 1));
        int lastN = int.Parse(r.Substring(r.Length - 1, 1)) + 1;
        return r.Substring(0, r.Length - 1) + lastN.ToString();
    }
}