greenhelix
greenhelix
greenhelix
02-20 12:08
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#49_Code Signal Arcade >> Line Encoding
Algorithm/Java

#49_Code Signal Arcade >> Line Encoding

2020. 6. 27. 21:57

Code Signal -Arcade

코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당. 

주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...

되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요! \


LineEncoding

줄 인코딩

주어진 문자열에 알파벳이 있다. 

이러한 알파벳들의 각 해당 문자의 수를 세서 앞에 붙여주고 다른 문자도 같은 작업을 해달라는 문제이다.

 

답안을 보겟습니다.

String lineEncoding(String s) {

  //맨 뒷 문자는 아무거나 하나 붙여준다. 반복문에서 인덱스 값을 겹치지 않게 하기 위함이다.   
  s += "#";
  System.out.println(s);
  // 최초 카운트 수는 1로 선언해준다. 
  int cnt = 1;
  // 리턴값을 넣을 결과값을 stringbuilder를 이용해서 append()를 사용할 수 있게 해준다. 
  StringBuilder result = new StringBuilder();
  
  for (int i = 1; i < s.length(); i++) {
    if (s.charAt(i) == s.charAt(i - 1)) {
        //앞문자와 뒷문자가 같다면 cnt+1을 한다. 
      cnt++;
    } else {
        //같지 않다면, 새로운 문자의 등장이므로, 카운트된 것을 완료해주고 새로운 작업을 시작하는 프로세스를 가진다.
        if (cnt > 1) {
        // 카운트가 1보다 큰경우 카운트 하던 문자가 아닌 새로운 문자가 등장한것이므로 cnt를 숫자를 붙여주고 패스.
            result.append(cnt);
            System.out.println("cnt add...result = "+result);
        }
      //카운트 숫자를 붙인는 행위 외에는 새로운 문자의 등장 말고, 바로그 직전의 카운트 완료된 문자를 붙여준다. 
      result.append(s.charAt(i-1));
      System.out.println("char add...result = "+result);
      //작업이 완료되었으니, 다시 카운트는 1로 리셋 해주어서 새로운 문자의 카운트를 시작한다.
      System.out.println("cnt reset!!");
        cnt=1;
    }
  }
  //stringbuilder였던 result를 문자열로 형변환한뒤 리턴한다.
  return result.toString();
}

기본적인 원리는 앞문자와 뒷문자를 같은지 확인하고 같으면 카운트를 하고 다르면 카운트를 끝내고 charAt(i-1)의 문자를 추가해주는 것입니다. 

 

 


이제 엘리트 분들의 답안을 감상하자... 

JAVA

String lineEncoding(String s) {
    Matcher m = Pattern.compile("([a-z])\\1*").matcher(s);
    String result = "";
    while(m.find()){
        int len = m.group(0).length();
        char cha = m.group(0).charAt(0);
        result += (len==1?"":len) + "" + cha;
    }
    return result;
}

정규식을 통한 해결방법입니다. 

 

Python3

from itertools import groupby
def lineEncoding(s):
    x = ''
    for k,g in groupby(s):
        y = len((list(g)))
        if y==1:
            x += k
        else:
            x += str(y) + k
    return x

itertools 에서 groupby()함수를 활용한 풀이법이네요. 

Groupby는 list에 활용하는 함수로 보이는데, 특이하네요. 한번 저도 해봐야 알것같습니다. 대충,, 문자열 길이를 통해 문자와 숫자를 + 하여 푸는 풀이법 같습니다.

 

JS

lineEncoding = s =>
    s.replace(
        /(.)\1*/g, 
        (e,i) => i==e ? i : e.length+i
    )

가장 간단한 js 의 풀이법입니다. replace를 통해, 정규식인가요.. 잘 모르겠네요.ㅋㅋ 

 

 

공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!

부탁드려요 돈드는거 아니잖아요~

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Java' 카테고리의 다른 글

#50_Code Signal Arcade >> Chess Knight  (0) 2020.06.28
#48_Code Signal Arcade >> is Digit  (0) 2020.06.10
#47_Code Signal Arcade >> Is MAC 48 Address?  (0) 2020.06.09
    'Algorithm/Java' 카테고리의 다른 글
    • #51_Code Signal Arcade >> Delete Digit
    • #50_Code Signal Arcade >> Chess Knight
    • #48_Code Signal Arcade >> is Digit
    • #47_Code Signal Arcade >> Is MAC 48 Address?
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바