Backend/알고리즘

[카카오 기출 2018] 압축

박상윤 2023. 11. 25. 01:50

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17684

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제는 문제에 나온 그대로 구현을 해주었다.

HashMap 자료형을 사용해서 Key : 알파벳, Value : index로 잘 매칭해주었다.

 

생각의 흐름

1. 문자가 포함되어 있는 경우

    1-1. 다음 문자열 추가후, 포함여부 확인

         1-1-1. 문자열이 포함되지 않는다면, 추가되기 전의 문자 index값 return

         1-1-2. 문자열이 포함된다면 문자 추가후, 포함여부 확인(계속)

 

2. 문자가 포함되지 않은 경우

 HashMap에 문자와 인덱스 추가하기

 

 

풀이

import java.util.*;

class Solution {
    public int[] solution(String msg) {
        
        List<Integer> answer = new ArrayList<>();
        Map<String,Integer> alphabets = new HashMap<>();
        
        char ch = 65;
        for(int i = 0; i < 26; i++){
            alphabets.put(String.valueOf(ch), i+1);
            ch++;
        }
        
        for(int i = 0; i < msg.length(); i++){
            char value = msg.charAt(i);
            if(alphabets.containsKey(String.valueOf(value))){ // 존재한다면 다음으로 넘겨
                int[] res = find(alphabets, i, msg);
                i+= res[1];
                answer.add(res[0]);
            }else{
                alphabets.put(String.valueOf(value),alphabets.size()+1);
                answer.add(alphabets.get(value));
            }
        }
        
        int[] res = new int[answer.size()];
        for(int i = 0; i < answer.size(); i++){
            res[i] = answer.get(i);
        }
        
        return res;
    }
    
    public int[] find(Map<String,Integer> alphabets, int idx, String msg){
        
        String value = String.valueOf(msg.charAt(idx));
        int number = alphabets.get(value);
        int k = 0;
        for(int j = idx+1; j < msg.length(); j++){
            value = value + String.valueOf(msg.charAt(j));
            if(alphabets.containsKey(value)){
                k++;
                number = alphabets.get(value);
            }else{
                alphabets.put(value,alphabets.size()+1);
                break;
            }
        }
        
        return new int[]{number,k};
    }
}

 

 

 

char ch = 65;
for(int i = 0; i < 26; i++){
    alphabets.put(String.valueOf(ch), i+1);
    ch++;
}

 

알파벳을 만들기 위해서 아스키 코드를 사용했다.

소문자 a의 아스키 코드 :  65

char에 숫자를 선언해준뒤, 하나씩 그 수를 더해가며 알파벳을 완성할 수 있다.

 

참고로 알파벳은 A ~ Z까지 총 26개이다.