Algorithm/programmers

[2018 카카오 블라인드 3차]압축

마닐라 2022. 4. 14. 23:59

📍 문제 설명

https://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

 

💡 접근

첫번째 글자부터 시작해서 다음 글자를 계속해서 이어 붙이는데, 사전에 추가되는 문자열이 최대일 때 출력해주면 되는 문제였다.

 

 

👩‍💻 코드

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Solution {
    public int[] solution(String msg) {
        int[] answer = {};
        HashMap<String, Integer> map = new HashMap<>();
        String[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
        for(int i = 1; i <= 26; i++) map.put(alphabet[i-1], i);

        StringBuilder w = new StringBuilder();
        ArrayList<Integer> list = new ArrayList<>();
        int indexNumber = 0;
        for(int i = 0; i < msg.length(); i++) {
            StringBuilder c = new StringBuilder();
            w.append(msg.charAt(i));
            if(map.containsKey(w.toString())) indexNumber = map.get(w.toString());

            String wc = ""; //사전추가될 글자
            //다음 글자가 존재하는 경우
            if(i < msg.length() - 1) {
                c.append(msg.charAt(i+1));
                wc = w.toString() + c.toString();
                //더한 글자가 사전에 있으면 다음글자 탐색
                if(map.containsKey(wc.toString())) continue;
            }
            //출력
            list.add(indexNumber);
            //사전 추가
            map.put(wc, map.size()+1);
            w.setLength(0);
        }
        answer = new int[list.size()];
        for(int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        System.out.println(Arrays.toString(answer));
        return answer;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        Solution s = new Solution();
        String m = "KAKAO";
        s.solution(m);
    }
}