문자열 압축하기

문자열을 입력받아서, 같은 문자가 연속적으로 반복되는 경우에 그 반복 횟수를 표시하여 문자열을 압축하기.

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

run-length
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

6개의 풀이가 있습니다.

C#으로 작성했습니다. StringBuild를 사용하여 algorithm을 개선했습니다. time complexity O(n) and space complexity O(n) 입니다.

using System.Text;

        public string PrintCompression(string input)
        {
            var count = 1;
            var last = input[0].ToString();
            var output = new StringBuilder();
            for (int i = 1; i < input.Length; i++)
            {
                if (input[i].ToString() != last)
                {
                    output.Append(last);
                    output.Append(count);
                    last = input[i].ToString();
                    count = 1;
                    continue;
                }
                count++;
            }
            output.Append(last);
            output.Append(count);
            return output.ToString();
        }

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
static string Answer(string str)
        {
            int cnt = 1;
            string retrun = "";


            Stack<string> test = new Stack<string>();

            for (int i = str.Length - 1; i > 0; i--)
            {
                if (str[i] == str[i-1])
                {
                    cnt++;
                }
                else
                {
                    test.Push(str[i] + cnt.ToString());
                    cnt = 1;
                }

                if (i==1)
                {
                    test.Push(str[i - 1] + cnt.ToString());
                }
            }

            while (test.Count != 0)
            {
                retrun += test.Pop();
            }

            return retrun;
        }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
        static void Main(string[] args)
        {
            string s = Console.ReadLine();
            for(int i = 0; i < s.Length;i++)
            {
                int count = 1;
                for (int x = i; x < s.Length-1; x++)
                {
                    if (s[x] == s[x + 1])
                    {
                        count++;
                    }
                    else
                    {
                        break;
                    }
                }
                i += count - 1;
                Console.Write(s[i] + count.ToString());
            }

        }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
        static string Compress(string str)
        {
            StringBuilder sb = new StringBuilder();
            int count = 1;

            for (int i = 1; i < str.Length; i++)
            {
                string a = str.Substring(i, 1);
                string b = str.Substring(i - 1, 1);

                if (a.Equals(b))
                {
                    count++;
                }
                else
                {
                    sb.Append(b + count.ToString());
                    count = 1;
                }

                if (i == str.Length - 1)
                {
                    sb.Append(a + count.ToString());
                }
            }

            return sb.ToString();
        }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
            string Input = "★★※★★";
            List<char> C = Input.ToCharArray().ToList<char>();
            int cnt;
            Char tmp;
            String ANS = "";

            while (C.Count!=0)
            {
                tmp = C.First();
                cnt = 0;
                while(C.Count!=0&&tmp==C.First())
                {
                    cnt++;
                    tmp = C.First();
                    C.RemoveAt(0);
                }
                ANS += tmp.ToString() + cnt;
            }
            //ANS = ★2※1★2
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
static void Main(string[] args)
{
    try
    {
        string strReturn = string.Empty;
        strReturn = GetCompression("aaabbcccccca");

        Console.WriteLine(strReturn);
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        Console.ReadKey();
    }
}

static string GetCompression(string str)
{
    int count       = 0;
    string result   = string.Empty;
    string temp     = string.Empty;
    char[] chArray  = null;

    chArray = str.ToCharArray();
    temp    = chArray[0].ToString();

    for (int i = 0; i < chArray.Length; i++)
    {
        if(!chArray[i].ToString().Equals(temp))
        {
            result += temp + count.ToString();
            temp = chArray[i].ToString();
            count = 0;
        }
        count++;
    }

    result += temp + count.ToString();

    return result;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

run-length x 2
연관 문제
김우주, 2017/06/24 15:08

언어별 풀이 현황
전 체 x 151
python x 60
기 타 x 22
java x 36
cpp x 15
perl x 1
scala x 2
javascript x 3
cs x 6
php x 2
objectivec x 1
ruby x 1
go x 1
haskell x 1