Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/프로그래머스

    [프로그래머스] 문자열 압축

    2021. 7. 1.

    by. Hyeon-Uk

    반응형

    https://programmers.co.kr/learn/courses/30/lessons/60057?language=cpp 

     

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

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

    programmers.co.kr


     

    -풀이-

    브루트 포스를 이용하여 모든 경우를 검사하였다.

    먼저 문자열을 1개단위로 모두 쪼갠뒤, vector에 push_back해주었다.

    그런뒤, 쪼갠 문자열을 저장하는 vector를 검사하며,비교하는 문자열과 같은 문자열이있으면 cnt를 증가시키며 지나가고, 다른 문자열이 있으면, result에 개수와 문자열을 더해준 뒤, 비교하는 문자열을 해당 문자열로 바꿔주고, cnt=1로 초기화를 해준다. 이때 cnt값이 1이라면 result에 문자열만 더해준다.

    이렇게 마지막까지 검사를 마친 뒤, answer값과 비교하여 더 작은것으로 갱신시켜준다

     

    이 작업을 문자열을 2개단위로 쪼갠뒤, 3개단위로 쪼갠뒤, ..... , N개 단위로 쪼갠뒤 까지 실행해준뒤,  answer를 출력해주면 된다.

     

    -시간복잡도-

    문자열을 쪼개고 검사하는 로직은 모두 O(N)이 걸리고, 이걸 1개단위~N개단위까지 반복해야 하므로, 총 O(N2)이 된다.

     

    -코드-

    #include <string>
    #include <vector>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    
    int answer=987654321;
    
    void cal(string str,int n){
        string temp="";
        string result="";
        vector<string> v;
        for(int i=0;i<str.size();i++){
            if(temp.size()<n){
                temp+=str[i];
            }
            else{
                v.push_back(temp);
                temp=str[i];
            }
        }
        v.push_back(temp);
        
        int ind=0;
        int cnt=1;
        for(int i=1;i<v.size();i++){
            if(v[i]==v[ind]){
                cnt++;
            }
            else{
                if(cnt==1){
                    result+=v[ind];
                }else{
                    result+=to_string(cnt)+v[ind];
                }
                ind=i;
                cnt=1;
            }
        }
        if(cnt==1){
            result+=v[ind];
        }else{
            result+=to_string(cnt)+v[ind];
        }
        
        if(answer>result.size()){
            answer=result.size();
        }
    }
    
    int solution(string s) {
        for(int i=1;i<=s.size();i++){
            cal(s,i);
        }
        return answer;
    }

     

    반응형
    저작자표시

    '문제풀이 > 프로그래머스' 카테고리의 다른 글

    [프로그래머스] 자물쇠와 열쇠  (0) 2021.07.02
    [프로그래머스] 괄호 변환  (0) 2021.07.02
    [프로그래머스] 직사각형 별찍기  (0) 2021.06.19
    [프로그래머스] x만큼 간격이 있는 n개의 숫자  (0) 2021.06.19
    [프로그래머스] 행렬의 덧셈  (0) 2021.06.19

    댓글

    관련글

    • [프로그래머스] 자물쇠와 열쇠 2021.07.02
    • [프로그래머스] 괄호 변환 2021.07.02
    • [프로그래머스] 직사각형 별찍기 2021.06.19
    • [프로그래머스] x만큼 간격이 있는 n개의 숫자 2021.06.19
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바