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

leehyunjon·2022년 4월 26일
0

Algorithm

목록 보기
9/162

[3차] 압축 : https://programmers.co.kr/learn/courses/30/lessons/17684

Problems




Solves

문자열 msg를 순차적으로 돌면서 현재 문자 w와 다음 알파벳 c가 사전에 등록되어있지 않다면 w+c 문자를 사전에 추가하고 색인은 초기화 시켜준다. 그 다음에는 알파벳 c가 w가 되고 w+c를 사전 등록 여부를 확인하면서 반복해준다.
w의 등록 여부를 마치게 되면 색인을 색인 리스트(indexs)에 저장해주게 된다.
이 때 주의 해야 할점은 w가 마지막 단어 까지 돌았을때 w의 index를 관리해 주지 않으면 프로세스가 꼬이게 된다.(코드에서 확인)

색인 리스트(indexs)에 있는 색인을 반환해주면 된다.


Code

import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
    public int[] solution(String msg) {
    	//사전
        HashMap<String, Integer> map = new HashMap<>();
        //사전 초기화
        setMap(map);
        //index리스트
        List<Integer> indexs = new ArrayList<>();
        
        for(int i=0;i<msg.length();i++){
        	//사전에서 현재 입력과 일치하는 가장 긴 문자열 w 초기화
            String w = String.valueOf(msg.charAt(i));
            
            for(int j=i+1;j<msg.length();j++){
            	//다음 글자 c	
                String c = String.valueOf(msg.charAt(j));
                //사전에 저장 여부를 확인할 단어
                String wc = w+c;
                //해당 단어가 사전에 저장되어있지 않다면
                if(!map.containsKey(wc)){
                	//사전에 등록해주고
                    map.put(wc, map.size()+1);
                    //다음 사전에 등록을 비교할 단어를 위한 index i 관리
                    i = j-1;
                    break;
                }
                //wc가 사전에 등록되어있으므로 wc가 사전에서 현재 입력과 일치하는 가장 긴 문자열 w가 된다.
                w = wc;
                //c를 문자열 끝까지 비교했다면 다음 비교할 단어는 없기때문에 i도 j로 바꿔줘 더 이상 반복문에서 비교할수 없게 끝내준다.
                if(j==msg.length()-1){
                    i=j;
                }
            }
            //비교가 끝난 w를 indexㅔ 넣어준다
            indexs.add(map.get(w));
        }
        
        int[] answer = new int[indexs.size()];
        for(int i=0;i<indexs.size();i++){
            answer[i] = indexs.get(i);
        }
        return answer;
    }
    
    //사전 초기화
    void setMap(HashMap<String, Integer> map){
        char alpabet = 'A';
        for(int i = 1;i<=26;i++){
            map.put(String.valueOf(alpabet),i);
            alpabet+=1;
        }
    }
}

Result


이제 조금씩 char을 다루는게 익숙하고 index를 다루는게 바로 생각나지는 않지만 조금 고민해보고 예상해본 상황이 들어맞는게 신기하다.

profile
내 꿈은 좋은 개발자

0개의 댓글