본문 바로가기

프로그래머스/문자열

압축 - KaKao 기출

728x90

programmers.co.kr/learn/courses/30/lessons/17684

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;


vector<int> solution(string msg) {
    vector<int> answer;
    map<string,int>m;
    char s[2] = "A";
    for(int i=1; i<=26; i++){
        string cts(s);
        m[cts] = i;
        s[0] = s[0]+1;
    }
    string str = "";
    string w ="";
    string c = "";
    for(int i=0; i<msg.size(); i++){
      //  w=msg[i];
        int j = i;
        while(j<msg.size()){
            string tmp = str+msg[j];
            if(m.find(tmp)==m.end()){
                m[tmp] = m.size()+1;
                break;
            }
            else{
                str = tmp;
            }
            j++;
          }
   //     cout<<str<<endl;
        answer.push_back(m[str]);
        i = i+str.size()-1;
        str = "";
    }
    
    
    return answer;
}

<JAVA>

import java.util.*;
class Solution {
    public int[] solution(String msg) {
        
        HashMap<String,Integer>hm = new HashMap<>();
        ArrayList<Integer>arr = new ArrayList<>();
        char c = 'A';
     
        for(int i=1; i<=26; i++){
            String s= Character.toString(c);
            hm.put(s,i);
            c++;
        }
        
        if(msg.length()==1){ //만약에 한글자라면
            int[] answer = new int[1];
            if(hm.containsKey(Character.toString(msg.charAt(0)))){  //그 한글자의 번호를 arr에 넣어준다, 이때 Character->String으로 바꾸는거 중요 
            answer[0] = hm.get(Character.toString(msg.charAt(0)));  //Character->String으로 바꾸는거 중요 
            }
            return answer;
        }
        
        int num =27;
       
        String s ="";
        char nc = msg.charAt(0);
        s+=nc;
        
        
        for(int i=1; i<msg.length(); i++){

          
            while(i<msg.length()){
                
                nc=msg.charAt(i);
                s+=nc;
                if(!hm.containsKey(s)){break;}
                i++;
            }

            if(i==(msg.length())){ //i가 끝부분넘을때 처리하기(hm에 없어서 break로 나온 것인지, 아니면 length()크기만큼 i가되서 while문을 나왔는지 알수 없기 때문에 처리해줘야함)
                if(hm.containsKey(s)){ //이미 hashmap에 있는 문자열이라면
                    arr.add(hm.get(s.substring(0))); //나머지를 모두 arr에 넣어준다
                }
                else{ //hashmap에 있지 않다면 마지막 글자를 제외한 나머지를 모두 arr에 넣어준다
                    arr.add(hm.get(s.substring(0,s.length()-1)));
                     hm.put(s,num);
                     num++;
                }
            }
            else{arr.add(hm.get(s.substring(0,s.length()-1))); hm.put(s,num); //i가 끝부분 넘은게아니라면 s는 무조건 hashmap에 없으니까 넣어준다.
                     num++;}
            s="";
            i--;
            
        }
      
        int[] answer = arr.stream().mapToInt(i->i).toArray(); //ArrayList -> 배열로 고치기 

        
        return answer;
    }
}

 

'프로그래머스 > 문자열' 카테고리의 다른 글

올바른 괄호  (0) 2021.02.07
최댓값과 최솟값  (0) 2021.01.31
추석 트래픽  (0) 2021.01.29
JadenCase 문자열 만들기  (0) 2021.01.27
방금 그곡 - Kakao Blind recruitment  (0) 2021.01.25