티스토리 뷰

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17684?language=java# 

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

 

2. 코드

 
import java.util.*;

class Solution {
    
    // 알파벳 사전 초기화
    public static void initDic(HashMap<String, Integer> hm){
        for(int i = 0; i < 26; i++){
            hm.put(Character.toString('A' + i), i+1);
        }
    } 
    
    public int[] solution(String msg) {
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        ArrayList<Integer> numList = new ArrayList<Integer>();
        String sub = "";
        initDic(hm);
        
        int maxLen = 1; // 사전에 있는 단어의 최대 길이
        int idx = 27; // 다음 색인에 추가될 단어의 숫자
        for(int i = 0; i < msg.length(); i++){ // 단어의 앞쪽 알파벳부터
            for(int l = maxLen; l >= 1; l--){ // 가장 긴 문자열부터 매칭되는지 찾는다
                
                if(i + l > msg.length()) continue;
                
                sub = msg.substring(i, i + l);
                if(hm.containsKey(sub)){ // 사전에 있으면
                    numList.add(hm.get(sub)); // 답에 추가
                    maxLen = Math.max(maxLen, sub.length() + 1); // 가장 긴 문자열 길이 갱신
                    i += l - 1;
                    break;
                }
            }
            
            if(i + 1 >= msg.length()) break;  // 마지막까지 매칭 찾았으면 종료
            
            // 사전에 추가
            String next = sub + Character.toString(msg.charAt(i + 1));
            if(hm.containsKey(next) == false)
               hm.put(next, idx++); // 다음 색인 추가
        }
        
        int[] answer = new int[numList.size()];
        for(int i = 0; i < answer.length; i++){
            answer[i] = numList.get(i);
        }
        return answer;
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함