자바/코딩테스트

[프로그래머스] [3차] 압축 - Java(자바)

대전집주인 2024. 3. 29. 15:13
728x90
SMALL

 

문제 이해

  • A - Z 까지 대문자 사전이 1 ~ 26까지 색인번호를 가지고 있다.
  • 문자열에서 첫글자 다음글자를 자르고 사전과 비교하였을때 사전에 미존재하면 색인번호를 올려서 새로 추가한다.
  • 사전에 없는 문자가 나올때까지 계속 자른다.
  • 문자열은 1000글자 이하로 이중for문을 사용하였다.
  • map에다 A-Z를 키로 색인번호를 value로 생성, 추가되는 사전단어가 나올때마다 색인번호를 올려서 추가
  • 색인번호가 신규 추가가 되면 기존에 사용한 영문자는 사용하면 안된다. cnt에 사용한 영문자의 수를 체크하여 사용못하게 넘어간다.
  • 영문자 tmp 가 msg의 마지막 영문자를 사용하고 해당 문자열이 키에 존재한다면 문자열의 색인번호를 집어넣고 for문을 끝낸다.
import java.util.*;
class Solution {
    public int[] solution(String msg) {
        
        Map<String, Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList();
        int num = 27;
        char ch = 'A';
        
        // 사전에 영문자, 색인번호 추가
        for(int i=1;i<=26;i++) {
            map.put(String.valueOf(ch), i);
            ch++;
        }
        int cnt = 0;
        
        // A - 26
        for(int i = 0; i<msg.length(); i++){
            String tmp = "";
            int check = 0;
            if(cnt > 0){
                cnt--;
                continue;
            }
            for(int j = i; j<msg.length(); j++){
                tmp += msg.substring(j, j+1);
                           
                // 마지막 체크
                if(j == msg.length() - 1 && map.containsKey(tmp)){
                    list.add(map.get(tmp));
                    check = 1;
                    break;
                }
                
                if(map.containsKey(tmp)){
                    continue;
                }else{
                    map.put(tmp, num++);
                    list.add(map.get(tmp.substring(0, tmp.length()-1)));                
                    cnt = tmp.length()-2;
                    break;
                }
            }
            
            if(check == 1) break;
        }
        
        int[] answer = new int[list.size()];
        for(int i = 0; i<list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}
728x90
LIST