본문 바로가기
Algorithm/Programmers Java

[JAVA] 프로그래머스 LEVEL2 [3차] 압축

by 제우제우 2024. 10. 9.

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

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [3차] 압축

 

난이도: LEVEL2

알고리즘 유형: 구현 

문제 분석 

그렇게 어려운 난이도는 아니었지만 여러 가지 분기 처리를 해줘야 했다. 

 

나는 HashMap을 사용해서 문제를 풀었다. 

우리는 사전에 맞게 숫자를 출력하고 사전에 없으면 숫자를 추가하는 게 목표이다. HashMap<String, Integer>

먼저 길이가 1인 문자들을 HashMap에 초기화 해준다. (A ~ Z) 

이제 문자 길이가 2 이상인 문자들은 입력으로 주어진 msg를 탐색하면서 추가하거나 출력해야 한다.  


사전 추가 같은 경우 현재 인덱스에서 사전(HashMap)에 key가 없는 문자열을 찾을 때 까지 문자열 추가해 나갔어야 하는데 만약 마지막 index까지 찾았다면 탐색을 멈추고 
해당 문자열이 사전에 있는지 없는지 판단 후 출력해야 했다. 

 

정답 코드 

import java.util.*;
import java.util.stream.*;
class Solution {
    static HashMap<String, Integer> map = new HashMap<>();
    public int[] solution(String msg) {
        int cnt = 1;
        for(char i = 'A'; i <= 'Z'; i++){
            map.put(Character.toString(i), cnt++);
        }
        ArrayList<Integer> list = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        
        Queue<String> q = new LinkedList<>();
        
        IntStream.range(0, msg.length())
            .forEach(i -> q.add(Character.toString(msg.charAt(i))));
        
        while(!q.isEmpty()){
            while(!q.isEmpty()){
                sb.append(q.poll());
                if(!map.containsKey(sb.toString())){
                    break;
                }
            }
            if(map.containsKey(sb.toString())){
                list.add(map.get(sb.toString()));
            }
            else{
                map.put(sb.toString(), cnt++); // 사전에 추가 
                String get = sb.substring(0, sb.length() - 1);
                String next = sb.substring(sb.length() - 1, sb.length());
                list.add(map.get(get));
                sb.setLength(0);
                sb.append(next);
                if(q.isEmpty()){
                    list.add(map.get(next));
                }
            }
        }
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}