문자열 압축하기

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

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

run-length

2014/12/05 22:35

RoseMonarchy

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

163개의 풀이가 있습니다. 1 / 17 Page

파이썬 2.7


s = 'aabcccaaaaas'

result = s[0]  # 첫번째 값을 결과에 넣는다
count  = 0   #

for st in s:
    if st == result[-1]:  #
        count += 1
    else:
        result += str(count) + st
        count = 1
result += str(count)

print result


결과:
a2b1c3a5s1

2015/12/29 21:49

hana11

간단한 부분만 사용하였고, 직관적이고 좋네요 감사합니다 - 님드락, 2016/11/22 16:17 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def stringCompress_rec(string):
    ans = ''
    count = 1
    string = string + '\0'
    for i in range(1, len(string)):
        if string[i - 1] == string[i]:
            count += 1
        else:
            ans += string[i - 1] + str(count) + stringCompress_rec(string[i:])
            break
    return ans
코드가 참 깔끔하고 알아보기가 쉽네요 - Shin gil sang, 2015/11/09 19:30 M D
string = string + '\0' 이부분의 의미가 어떻게 되나요? - kim SeongHyeon, 2016/08/06 16:24 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def compress_string(string)
  string.scan(/(\w)(\1*)/).map{|c, l| c + (l.size + 1).to_s}.join
end

지금 다시보니 gsub 만으로 해결할 수 있는 문제네요.

def compress_string(string)
  string.gsub(/((\w)\2*)/) { "#{$2}#{$1.size}"}
end
R 인가요? - 예강효빠, 2017/05/27 02:51 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
class String
  def compress
    self.chars.chunk{|e|e}.map{|e,a|[e,a.size]}.join
  end
end

루비 Enumerator를 체이닝해서 풀었습니다. 풀이 과정을 조금 풀어써보면, 아래와 같습니다.

"aaabbcccccca".compress
=> "a3b2c6a1"
"aaabbcccccca".chars
=> ["a", "a", "a", "b", "b", "c", "c", "c", "c", "c", "c", "a"]
"aaabbcccccca".chars.chunk{|e|e}.to_a
=> [["a", ["a", "a", "a"]], ["b", ["b", "b"]], ["c", ["c", "c", "c", "c", "c", "c"]], ["a", ["a"]]]
"aaabbcccccca".chars.chunk{|e|e}.map{|e,a|[e,a.size]}
=> [["a", 3], ["b", 2], ["c", 6], ["a", 1]]
"aaabbcccccca".chars.chunk{|e|e}.map{|e,a|[e,a.size]}.join
=> "a3b2c6a1"
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

언어는 자바입니다. 정규 표현식의 lookaround, capturing group 을 이용했습니다.

package rootcucu.codefight;


public class CharacterRepeat {
    public static void main(String[] args){
        CharacterRepeat obj = new CharacterRepeat();
        for (String a:"aabbbcccdd ####$$&&&&&&!! 귤귤귤감감배배배배".split(" "))
            System.out.println(a + "\n" + obj.compress(a) + "\n");
    }

    String compress(String s) {
        String t = "";
        for (String u : s.split("(?<=(.))(?!\\1)"))
            t = t + u.charAt(0) + u.length();
        return t;
    }

}

실행 결과입니다.

aabbbcccdd
a2b3c3d2

####$$&&&&&&!!
#4$2&6!2

귤귤귤감감배배배배
귤3감2배4
죄송하지만 s.split("(?<=(.))(?!\\1)") 이부분에 대해서 자세히 설명해주실분 계신가요? ㅠㅠ 정규식을 잘 몰라서요 - 김재인, 2017/03/28 17:54 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

그냥 C/C++ 언어 답게 풀었습니다. 쉬운 문제인데 이런 문제도 코딩 인터뷰에서 아주 자주 등장합니다.

#include <iostream>
#include <string>
#include <cassert>
#include <sstream>

std::string compress(const std::string &input) {
  if (input.length() == 0)
    return "";

  std::stringstream ss;
  char prev = input[0];
  int count = 0;
  for (auto c : input) {
    if (prev != c) {
      ss << prev << count;
      prev = c;
      count = 1;
    } else {
      ++count;
    }
  }
  ss << prev << count;
  return ss.str();
}

int main() {
  assert(compress("aaabbcccccca") == "a3b2c6a1");
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

펄입니다 저도 정규표현식으로 풀려고 했는데 이미 쓰신 분이 계셔서 ;;

perl -e 'my%check;for(split "",$ARGV[0]){$check{$_}++}for(keys %check){print $_,$check{$_}}'
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def comp(a):
     b=sorted(list(set(a)))
     result = ''
     for s in b:
          result += s
          result += str(a.count(s))
     return result




※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
from itertools import *
while __name__ == '__main__':
    inpt = input('입력: ');s = ''
    for x, y in groupby(inpt):
        z = len(list(y))
        s = s+x
        if z>1:s = s+str(z)
    print(s)

짧게 줄이려고 했는데 y를 한번 호출하면 빈 리스트가 돼서 포기했습니다.... 파이썬 3.5.1입니다.

+추가: 시간이 지나고 보니 줄일 수 있더군요.

from itertools import groupby
while __name__ == '__main__':
    print(''.join(x + (lambda z: str(z) if z>1 else '')(len(list(y))) for x,y in groupby(input('입력: '))))

+줄바꿈 없음

list(print(''.join(x + (lambda z: str(z) if z>1 else '')(len(list(y))) for x,y in __import__('itertools').groupby(input('입력: ')))) for x in __import__('itertools').count())

+임포트 반복 제거

(lambda it: list(print(''.join(x + (lambda z: str(z) if z>1 else '')(len(list(y))) for x,y in it.groupby(input('입력: ')))) for x in it.count()))(__import__('itertools'))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python

import re

input_data = "aaabbcccccca"

filted = re.findall("(\\w)(\\1*)", input_data)

output = ""
for x, y in filted:
    output += x
    if not len(y) == 0:
        output += str(len(y) + 1)  

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

풀이 작성

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

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

run-length x 2
연관 문제
Noname, 2017/08/17 23:29

언어별 풀이 현황
전 체 x 163
python x 66
기 타 x 23
java x 39
cpp x 16
perl x 1
scala x 2
javascript x 3
cs x 7
php x 2
objectivec x 1
ruby x 1
go x 1
haskell x 1