💡Problem Solving/Programmers

[프로그래머스] 압축 (Java)

gom20 2021. 11. 24. 13:25

문제

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

 

풀이

구현 문제이다. 

아스키 코드를 이용하여 Map에 각 알파벳에 해당하는 색인 번호를 저장해두고 시작한다.

마지막 인덱스 경계값을 신경써서 구현해야 한다. 

풀이는 소스코드에 주석을 달아놨다.

 

소스코드

import java.util.*;
class Solution {
    public int[] solution(String msg) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        // A = 65
        // Z = 90
        // 색인 번호 ASCII code - 64

        // 문자 - 색인번호 저장할 Map 생성
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(int i = 65; i <= 90; i++){
            map.put(String.valueOf((char)i), i-64);
        }

        int dirIdx = 27; // 색인 번호
        int i = 0; // 시작 인덱스
        int len = msg.length(); // 문자 길이
        while(i < len){
            if(i == len-1){
                // 만약 마지막 인덱스라면, 마지막 문자의 색인번호를 출력
                list.add(map.get(String.valueOf(msg.charAt(i))));
                break;
            }
            // 마지막 인덱스가 아니라면,
            
            // 현재 문자
            String w = String.valueOf(msg.charAt(i));
            i++;
            while(true){
                // 인덱스가 길이보다 크다면 중지
                if(i >= len) break;
                
                // 다음 문자를 가져온다.
                String next = String.valueOf(msg.charAt(i));
                // 현재 문자 + 다음 문자 가 색인 번호가 있는지?
                if(!map.containsKey(w + next)) {
                    // 없다면 추가한다. 
                    map.put(w + next, dirIdx);
                    dirIdx++;
                    break;
                }
                // 색인 번호가 있다면 현재 문자에 다음 문자를 붙인다.
                w += next;
                i++; // 색인번호 없는 경우가 나올 때까지 반복
            }
            
            list.add(map.get(w));
        }
        
        return list.stream().mapToInt(x -> x).toArray();
    }
}