문자열 압축하기

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

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

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

28개의 풀이가 있습니다. 1 / 3 Page

언어는 자바입니다. 정규 표현식의 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
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

java로 풀었습니다

어휴~ 지저분하네요 ㅠㅠ 반성하겠습니다.

public class Test_465 {

    public String compress(String str){
        int cnt=0;
        char tmp=' ';
        String result="";
        for(int i=0;i<str.length();i++){
            if(tmp==' '){
                tmp=str.charAt(i);
                cnt++;
            }else if(tmp==str.charAt(i)){
                cnt++;
            }else{
                result+=tmp+String.valueOf(cnt);
                cnt=0;
                tmp=str.charAt(i);
                cnt++;
            }
            if(i==str.length()-1)
                result+=tmp+String.valueOf(cnt);
        }
        return result;
    }

    public static void main(String args[]){
        System.out.println(new Test_465().compress("aaabbddbbeebbbba"));
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

자바입니다.

import java.util.Scanner;

public class CompressString {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("enter the Text : ");
        String input = sc.nextLine().trim();
        if("".equals(input)){
            System.out.println("the input is empty.");
        } else {
            System.out.println(CompressString.compress(input));
        }
        sc.close();
    }

    public static String compress(String text){
        char[] charArr = text.toCharArray();
        char prevChar=' ';
        StringBuffer sb= new StringBuffer();
        int charArrLength = charArr.length;
        int dupCnt=1;

        for(int i=0; i<charArrLength; i++){
            if(prevChar==charArr[i]){
                dupCnt++;
            } else {
                if(i!=0){ // 중복값에 대한 처리
                    sb.append(prevChar);
                    sb.append(dupCnt);
                }
                dupCnt=1;
            }
            prevChar = charArr[i];
            if(i==charArrLength-1){  // 마지막 값에 대한 처리
                sb.append(prevChar);
                sb.append(dupCnt);
            }           
        }

        return sb.toString();
    }

}

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

자바입니다.
다소 마음에 들지는 않네요. 첫값과 끝값 처리가 아쉽습니다.


public class Compress {
    public String compressString(String origin){
        if(origin == null || origin.length() == 0) return null;
        //첫 값 처리
        int count = 1;
        char oldChar = origin.charAt(0);
        char currentChar;
        StringBuffer sb = new StringBuffer();

        for(int i = 1; i < origin.length(); i++){
            currentChar = origin.charAt(i);
            if(currentChar == oldChar){
                count++;
            } else {
                sb.append(oldChar);
                sb.append(count);
                oldChar = currentChar;
                count = 1;

            }
        }
        //마지막 값 처리
        sb.append(oldChar);
        sb.append(count);
        return sb.toString();
    }
}


테스트 코드 입니다.

import static org.junit.Assert.*;

import org.junit.Test;


public class CompressTest
{
    @Test
    public void testCompressString(){
        String originStr = "aaabbcccccca";
        String expectedStr = "a3b2c6a1";
        Compress comp = new Compress();
        String actualStr = comp.compressString(originStr);
        System.out.println(actualStr);
        assertEquals(expectedStr, actualStr);

    }

}

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

public class compressstring {

    public String compress(String str){
        String result = "";
        char temp = ' ';
        int count=0;

        for( int i=0; i<str.length(); i++ ){
            if( temp == ' ' ){
                temp = str.charAt(i);
                count = 1;
            }
            else if( temp == str.charAt(i) ){
                count++;
            }
            else{   //temp != str.charAt(i)
                result = result + temp + String.valueOf(count);
                temp = str.charAt(i);
                count = 1;
            }
            if( i>=str.length()-1 ){
                result = result + temp + String.valueOf(count);
            }
        }
        return result;
    }

    public static void main(String[] args){
        System.out.println(new compressstring().compress("aaabbcccccca"));
    }
}

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

풀이법이 다들 비슷해보이기에^^; 정규식을 이용하고 Java의 Pattern, Matcher 클래스를 활용했습니다.

public class StringCompressor {
    public String compress(String arg) {
        Pattern p = Pattern.compile("(\\w)(\\1*)");
        Matcher m = p.matcher(arg);
        StringBuilder result = new StringBuilder();
        while( m.find() ) {
            result.append( arg.charAt(m.start()) + "" + (m.end()-m.start()) );
        }
        return result.toString();
    }

    @Test
    public void test() {
        assertEquals("a3b2c6a1", new StringCompressor().compress("aaabbcccccca"));
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
    private String test2(String s) {
        StringBuilder sb= new StringBuilder();
        int size = s.length();
        String lastText = "";
        int cnt = 0;
        for(int i=0; i<size; ++i ) {
            String tmp = s.substring(i, i+1);
            if("".equals( lastText )) {
                sb.append(tmp); cnt++;
                lastText = tmp;
            } else if(tmp.equals(lastText)){
                cnt++;
            } else {//카운트를 적고 초기화
                sb.append(String.valueOf(cnt));
                lastText = tmp; 
                sb.append(tmp); cnt = 1;
            }
            if(i == size-1) {
                sb.append(String.valueOf(cnt));
            }
        }
        return sb.toString();
    }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Java코드입니다.

간결하진않지만 갑자기 머리가돌아가서 짰는데 되긴하네요

public static void main(String[] args) {

      Scanner keyboard = new Scanner(System.in);
      String str;
      str = keyboard.nextLine() + " ";

      int temp = 1;

      char s; 
      String Final = "";

      for(int i = 0; i< str.length() - 1; i++){
          s = str.charAt(i);
          if (s == str.charAt(i+1)){
              temp++;
          } else {
              Final = Final + s + temp;
              temp = 1;
          }
      }
      System.out.println(Final);
}


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



public class Sample1 {

    public void compress(String arg) {

        char[] c = arg.toCharArray();

        char buffC = c[0];
        int cnt = 1;
        String retStr = "";
        for (int i=0; i<c.length; i++){

            if(c[i] == buffC){
                cnt ++;

            }else{
                retStr  += buffC+""+cnt;
                buffC = c[i];
                cnt=1;
            }
        }
        retStr  += buffC+""+cnt;

        System.out.println(retStr);
    }


    public static void main(String[] args) {
        new Sample1().compress("aaabbccccccaa");
    }



}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
static void exce72()
    {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        int n = 0;
        char piv = '\0';

        for (int i = 0; i < str.length(); i++)
        {
            if (str.charAt(i) != piv)
            {
                if (i != 0)
                {
                    System.out.printf("%c%d", piv, n);
                }
                piv = str.charAt(i);
                n = 1;
            } else
                n++;
        }
        System.out.printf("%c%d", piv, n);
        scan.close();
    }

무난무난하게 풀어봤습니다.

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

풀이 작성

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

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

run-length x 2
연관 문제

언어별 풀이 현황
전 체 x 128
haskell x 1
java x 28
scala x 2
python x 53
javascript x 1
perl x 1
cs x 5
기 타 x 19
go x 1
cpp x 13
objectivec x 1
php x 2
ruby x 1