하루에 한 문제

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 압축 -Java 본문

알고리즘/프로그래머스 lv2 다시풀기

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 압축 -Java

dkwjdi 2021. 3. 16. 21:59

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
class Solution {
	    public int[] solution(String msg) {
	        char alphabet='A';
	        List<Integer> result=new ArrayList<>();
	        HashMap<String, Integer> dic = new HashMap<>();
	        for( int i=0; i<26; i++) {
	        	dic.put(String.valueOf(alphabet), i+1);
	        	alphabet++;
	        }
	        int num=27;
	        StringBuilder sb= new StringBuilder();
	        for(int i=0; i<msg.length(); i++) {
	        	sb.append(msg.charAt(i));
	        	if(!dic.containsKey(sb.toString())) { //없다면 ?
	        		dic.put(sb.toString(), num++);//사전에 삽입
	        		result.add(dic.get(sb.toString().substring(0, sb.length()-1)));
	        		sb=new StringBuilder();
	        		i--;
	        	}
	        	
	        }
	        result.add(dic.get(sb.toString()));
	        int[] answer = new int[result.size()];
	        for(int i=0; i<result.size(); i++) {
	        	answer[i]=result.get(i);
	        }
	        return answer;
	    }
	}

소요시간 : 26분

 

처음에 문제를 이해하는데 시간이 좀 걸렸지만 

문제만 이해한다면 굉장히 쉬운 문제입니다!

 

로직을 살펴보면

 

우선 dic을 유지하기 위해 HashMap을 사용해줍니다.

dic에 A(1) ~ Z(26)까지 삽입을 해줍니다.

 

그리고 입력으로 들어온 문자를 0번부터 마지막 번호까지 돌아줍니다.

 

이때, 단어를 StringBuilder로 append 해주면서 dic에 없을 때까지 돌아줍니다.

만약 dic에 단어가 없다면

result에 현재 단어의 인덱스-1까지의 단어의 value를 넣어줍니다.

그리고 현재 단어를 dic에 추가해줍니다.

 

문제를 잘 이해한다면 쉬운 문제라 딱히 설명할 게 없는 것 같습니다

 

끝~

 

 

Comments