본문 바로가기

코딩 테스트/프로그래머스

압축

 

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

 

프로그래머스

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

programmers.co.kr

 

Level 2 

 

주어진 알고리즘 설명을 토대로 문자열을 압축한 결과값을 반환해야하는 구현 문제.

 

특별한 알고리즘 없이도 해결 방법을 찾을 수 있고 구현하는 과정에서 약간 어려울 뿐 크게 어렵지 않다. 

 

 

필자의 경우 위와 같이 구현하였으며 마지막 키의 경우 더 이상 뒤에 나올 문자열이 없으므로 최종 문자열 인덱스 확인 후 큐에 추가하고 정답을 반환했다. 

 

Hash 개념을 알고 있으면 크게 어렵지 않은 문제, 단 효율성 케이스가 없어 조금 아쉽긴 하나 그냥 단순히 배열을 완전 탐색하여 인덱스를 찾는 것 보다 Hash 가 훨씬 구현하기도 편하고 깔끔하다. 

 

import java.util.*;

public class Solution {
    public int[] solution(String msg) { //압축
        Queue<Integer> LZWQueue = new LinkedList<Integer>(); //LWZ 숫자가 담길 큐
        HashMap<String, Integer> LZWMap = new HashMap<String, Integer>(); //LWZ 인덱스 맵
        for(int cnt = 0; cnt < 26; cnt++) { //알파벳 대문자 초기 데이터 입력
            String key = "" + (char) ('A' + cnt);
            LZWMap.put(key, cnt+1);
        }

        String key = "";
        int lastLZWIndex = 26; //마지막 인덱스 정보
        for(int idx = 0; idx < msg.length(); idx++){
            String tempKey = ""+msg.charAt(idx); //현재 1byte 문자열
            if(key.length() > 0 && !LZWMap.containsKey(key + tempKey)) { //지난 문자열 + 현재 문자열을 가지고 있는지 확인
                LZWQueue.add(LZWMap.get(key)); //가지고 있지 않을 경우 지난 문자열의 인덱스 값을 큐에 추가
                LZWMap.put(key + tempKey, ++lastLZWIndex); //새로 인덱스 추가
                key = ""; //새로운 문자열로 시작
            }
            key += tempKey; //현재 문자열 병합
        }
        if(LZWMap.containsKey(key)){ //최종키 인덱스 추가
           LZWQueue.add(LZWMap.get(key));
        }else{
            LZWQueue.add(lastLZWIndex+1);
        }
        int[] answer = new int[LZWQueue.size()];
        for(int idx = 0; idx < answer.length; idx++) answer[idx] = LZWQueue.poll();
        return answer; //큐의 데이터 그대로 복사 후 반환
    }
}

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

n진수 게임  (0) 2023.01.16
파일명 정렬  (0) 2023.01.12
방금그곡  (0) 2023.01.11
프렌즈4블록  (0) 2023.01.10
캐시  (0) 2023.01.10