[프로그래머스] 압축 (JAVA)

개츠비·2023년 3월 1일
0

프로그래머스

목록 보기
1/16
post-custom-banner

문제를 다 푸는데 대략 1시간이 걸렸다

문제를 이해 못하겠어서 이해하는데 15분

문제 전체 알고리즘 짜는데 5분 ?
이해하자마자 해시맵을 써야하겠다고 느꼈다

대략적인 코드를 짜는 데에 20분

마지막으로 간단한 예외처리 하나 못해서 20분

도합 1시간.

전체적인 알고리즘은 대략 이렇다

  1. A-Z까지 해시맵에 넣어준다. 1~26까지의 값이 될 것이다
  2. 단어를 substring 메소드로 잘라서 이게 해시맵에 이미 있다면 단어의 길이를 1씩 계속해서 늘리고, 아니라면 새로 해시맵에 추가할 단어를 탐색한 것이 된다. (KAKAO를 예시로 하면 K 가 처음에 해시맵에 있을테니, 그 다음 단어인 KA 를 탐색한다. 이건 해시맵에 없으므로 탐색성공!)
  3. 그 단어를 해시맵에 넣어준다.
  4. 하지만 우리가 출력할 것은 그 전에 마지막으로 해시맵에 있었던 단어이다. (KA를 해시맵에 넣었지만 우리가 출력해야 하는 단어는 K의 hashMap value 이다) 그러므로 lastTrueWord 라는 변수를 통해서 이 단어를 해시맵에서 뽑아온다. 그리고 그 단어를 list에 add한다.
  5. 그리고 내가 그 당므으로 탐색할 단어는 last의 이전부터의 인덱스일 것이다
    ... (반복)

하지만 한 가지 예외는 단어의 길이를 계속해서 1씩 늘리는데 이 늘린 단어가 msg의 length() 보다 크면 안된다. 그 경우에는 예외처리 해주어야 한다. 2번째 while 안의 if문이 그것이다. 이 예외처리도 해주어야 한다고 전체적인 로직을 짤 때부터 알았지만, 어느 위치에서 이를 해결해주어야하는지때문에 너무 해맨 것 같다.

import java.util.*;
class Solution {
    public ArrayList<Integer> solution(String msg) {
        HashMap<String,Integer>map=new HashMap<>();
        char ch='A';
        for(int i=1;i<=26;i++){ //A부터 Z까지 해시맵에 넣어준다
            String n=Character.toString(ch);
            map.put(n,i);
            ch++;
        } 
        int start=0; //substring할 인덱스
        int last=0;
        
        int num=27; //27번째 알파벳부터 추가로 해시맵에 넣어줄 것이다
        
        ArrayList<Integer>list=new ArrayList<>();
        
        String lastTrueWord=""; //마지막으로 true 였던 단어
        
        while(last<=msg.length()){
            last=start+1; 
            String word=msg.substring(start,last);
  
           while(map.containsKey(word)==true){
               lastTrueWord=word;
               last++;
               if(last>msg.length()) {
                   break;
               }
                word=msg.substring(start,last);
           }      
            list.add(map.get(lastTrueWord));
            map.put(word,num);
            num++;
            start=last-1;
            
        }
       
    
        return list;
    }
}

https://solved.ac/profile/anwlro0212
하루에 백준 1문제 이상 무조건 푸는 것을 목표로 하고있고
곧 있을 소프트웨어 마에스트로 2차 코딩테스트에도 합격할 수 있었으면 한다.

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람
post-custom-banner

0개의 댓글