본문 바로가기

PS/프로그래머스

[프로그래머스 LV 2] 문자열 압축 C++, js

728x90

programmers.co.kr/learn/courses/30/lessons/60057#

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

코드가 정말 정말 정말 말도안돼서 내가 푼 코드와 다른 사람들의 풀이코드를 올릴건데..

정말... 테스트케이스에 똑같은 글씨가 1000개 있는 코드가 없어서 맞은거지

이건 절대 맞은 코드가 아니다.. 정말 임기응변용 코드

그래서 이건 따로 알고리즘 설명같은건 안했다.....하하....... 그래도 3시간동안 머리싸매면서 한문제라도 내 손으로 푼게 정말 기분은 좋다 .... 아니다 좋으면안됩니다 이건 너무 별로인코드입니다...

 

 

내가 푼 코드(참고 절대 ㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴ)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <string>
#include <vector>
 
using namespace std;
 
int solution(string s) {
    int answer = s.size();
    
    int cmp;    
    int idx;
 
    // i개 단위로 문자열을 잘라서 비교
    for (int i = 1; i <= (s.size() / 2); i++) {
        cmp = s.size();
        idx = s.size(); 
        int cnt = 0;
                
        for (int j = 0; j <= (s.size()-2*i); j+=i) {
            
            if (s.substr(j, i) == s.substr(j + i, i)) {
                cmp -= i;  
                cnt++;
            }        
            else {                
                if (cmp < idx) {
                    cmp += 1;
                    idx = cmp;     
                    cnt = 0;
                }                
            }             
            //가장 문제되는코드...... 이코드가 있는 이유는 나만알듯 ㅋㅋ;;;
            if (cnt >= 9) {
                cmp++;
                cnt -= 90;
            }            
        }              
        if (cmp < idx) cmp++;
        if (cmp < answer) answer = cmp;
    }
    return answer;
}
cs

 

 

 

다른분의 풀이를 보고 푼 참고버전,

중간중간 tmp에 갯수를 더할때 i를 쓰면안되고 current.size()를 써야한다

이유는 만약 문자열이 i의 갯수만큼 남아있지 않을 경우에

i개만큼 더하면 부족한 부분만큼 더하는게 아니라 정말 i개만큼 더해버리기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <string>
#include <vector>
 
using namespace std;
 
int solution(string s) {
    int answer = s.size(); 
   
 
    // i개 단위로 문자열을 잘라서 비교
    for (int i = 1; i <= (s.size() / 2); i++) {
        int cnt = 1, tmp = 0;
        string current = s.substr(0, i);
                
        for (int j = i; j < s.size() ; j += i) {
 
            if (current == s.substr(j, i))
                cnt++;
            else {
                if (cnt == 1)
                    tmp += current.size();
                else
                    tmp += (to_string(cnt).size() + current.size());
 
                current = s.substr(j, i);
                cnt = 1;
            }
        }
        if (cnt == 1) tmp += current.size();
        else tmp += (to_string(cnt).size() + current.size());
 
        if (tmp < answer) answer = tmp;
    }
    return answer;
}
cs

 

 

javascript 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function solution(s) {
  var answer = s.length;
 
 
  for (let i = 1; i <= s.length / 2; i++) {
    let cnt = 1,
      newStr = ``;
 
    for (let j = 0; j < s.length; j += i) {
      let current = s.substring(j, j + i);
      let next = s.substring(j + i, j + 2 * i);
 
      if (current === next) {
        cnt++;
      } else {
        if (cnt !== 1) {
          newStr += cnt + current;
        } else {
          newStr += current;
        }
        cnt = 1;
      }
    }
    answer = answer>newStr.length ? newStr.length : answer;
  }
  return answer;
}
cs

 

 

 

 

728x90