프로그래머스-2018 KAKAO BLIND RECRUITMENT ( 압축 by Java )

Flash·2022년 2월 21일
0

Programmers-Algorithm

목록 보기
41/52
post-thumbnail

구현 ( HashMap )

프로그래머스 2018 KAKAO BLIND RECRUITMENT Level 2 문제 압축Java를 이용해 풀어보았다.
HashMap을 이용해 간단하게 풀었다.

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/17684


사전 초기화

한 글자짜리 사전을 먼저 초기화한다. 단어를 Key, 색인 번호를 Value로 설정했다.

void dictInit(){
   char cur = 'A';
   for(int i=0; i<26; i++){
       String s = Character.toString(cur);
       cur++;
       map.put(s, i+1);
   }
}

A-Z까지 1번부터 26번으로 초기화해주는 메소드다.


존재하지 않는 단어 찾기

while문과 for문을 활용해서 앞에서부터 한 글자씩 추가해가며 map에 없는 단어를 찾게 되면,
1. 그 단어를 map에 기존 map 사이즈에 1을 더한 번호로 추가해주고,
2. 해당 단어의 마지막 글자만 뺀, 이미 존재하는 단어의 색인 번호를 결과 배열에 추가해주고,
3. 탐색을 마친 마지막 지점에서부터 마지막까지 msgsubString(int from)을 이용해서 새롭게 갱신한다.

이를 코드로 표현하면 다음과 같다.

ArrayList<Integer> list = new ArrayList<>();

while(msg.length()!=0){
       if(map.containsKey(msg)) {
           list.add(map.get(msg));
           break;
       }
       String tmp = "";
       int idx = 0;
       for(; idx<msg.length(); idx++){
           tmp += msg.charAt(idx);
           if(!map.containsKey(tmp)){ // 사전에 없는 단어면
               map.put(tmp, map.size()+1); // 사전에 추가해주고
               tmp = tmp.substring(0, tmp.length()-1);
               list.add(map.get(tmp)); // 막 글자 뺀 녀석 번호 추가해주고
               break;
           }
       }
       msg = msg.substring(idx); // 문자열 갱신해주고
}

HashMap을 이용한 그리 어렵지 않은 문제였다. 아래는 내가 제출한 코드다.

import java.util.ArrayList;
import java.util.HashMap;

public class Compressor {
    static HashMap<String, Integer> map = new HashMap<>();

    static int[] solution(String msg) {
        ArrayList<Integer> list = new ArrayList<>();
        dictInit();
        while(msg.length()!=0){
            if(map.containsKey(msg)) {
                list.add(map.get(msg));
                break;
            }
            String tmp = "";
            int idx = 0;
            for(; idx<msg.length(); idx++){
                tmp += msg.charAt(idx);
                if(!map.containsKey(tmp)){ // 사전에 없는 단어면
                    map.put(tmp, map.size()+1);
                    tmp = tmp.substring(0, tmp.length()-1);
                    list.add(map.get(tmp));
                    break;
                }
            }
            msg = msg.substring(idx);
        }
        int[] answer = list.stream().mapToInt(i -> i).toArray();
        return answer;
    }

    static void dictInit(){
        char cur = 'A';
        for(int i=0; i<26; i++){
            String s = Character.toString(cur);
            cur++;
            map.put(s, i+1);
        }
    }

    public static void main(String[] args) {
        String msg = "TOBEORNOTTOBEORTOBEORNOT";
        int[] answer = solution(msg);
        for(int a: answer) System.out.println(a);
    }
}
profile
개발 빼고 다 하는 개발자

0개의 댓글