본문 바로가기
Java/알고리즘

압축

by 티코딩 2023. 10. 26.

 

ㅇ 1트

먼저 길이가 자유로운 리스트에다가 알파벳을 순서대로 집어넣었다. 완벽히 풀진 않았지만 1트에서 구현 하고자 했던건 KAKAO가 주어질때, KAKAO를 alp에서 찾고 없으면 KAKA를 찾고 없으면 KAK를 찾고 없으면 KA를 찾고 없으면 K를 찾고 있으니,K의 index인 11를 ans 리스트에 집어넣는것과 KA를 alp에다가 넣는것 까지 구현했다. ans를 리스트로 만든이유는, 반복문을 돌 때 언제끝날지 모르기 때문에 add를 쓰면 쉬워지기 때문에 리스트로 썼다. 이제 구현해야하는건, 그 다음에 AKAO부터 차례로 다시 검증해가면서 index를 ans에 집어넣고, AK를 alp에 넣는것이다. 이렇게 마지막 까지 반복하는거다.

public static int[] solution(String msg) {
        int[] answer = {};

        //A=1 Z=26 을 넣어야함.
        List<String> alp = new ArrayList<>();
        List<Integer> ans = new ArrayList<>();
        for (char c = 'A'; c <= 'Z'; c++) {
            alp.add(String.valueOf(c));
        }
       
        int startIndex = 0;
        int endIndex = msg.length()-1;
        int index = -1;
        for(int i = 0; i < msg.length(); i++){
            //kakao를 alp에서 찾고 없으면 kaka를 찾고 없으면 kak를 찾고 없으면 ka를 찾고 없으면 k를 찾는식
            while (startIndex <= endIndex) {
                String substring = msg.substring(startIndex, endIndex + 1);
                if (alp.contains(substring)) {
                    String modifiedMsg = msg.replaceFirst(substring, "");
                    index = alp.indexOf(substring)+1;
                    ans.add(index);
                    alp.add(msg.substring(startIndex,endIndex+1));
                    msg = modifiedMsg;
                    break;
                }
                endIndex--;
            }
            System.out.println(ans);

        }

        return answer;
    }

ㅇ 2트

alp 과 ans는 똑같다. 반복이 바뀌었는데, KAKAO를 검증하고, K인덱스를 집어넣고, AKAO를 검증해야하는걸 startIndex = endIndex로 바꿨다. 그러고 ans리스트를 answer[] 배열로 바꿔주고 리턴.

public static int[] solution(String msg) {
        List<String> alp = new ArrayList<>();
        List<Integer> ans = new ArrayList<>();

        // 알파벳을 초기화
        for (char c = 'A'; c <= 'Z'; c++) {
            alp.add(String.valueOf(c));
        }

        int startIndex = 0;

        while (startIndex < msg.length()) {
            int endIndex = startIndex;
            String currentSubstr = "";

            // 현재 문자열을 찾아 alp에 있는지 확인
            while (endIndex < msg.length() && alp.contains(currentSubstr + msg.charAt(endIndex))) {
                currentSubstr += msg.charAt(endIndex);
                endIndex++;
            }

            // alp에서 찾은 문자열의 인덱스를 저장
            ans.add(alp.indexOf(currentSubstr) + 1);

            // 다음 문자열을 alp에 추가
            if (endIndex < msg.length()) {
                alp.add(currentSubstr + msg.charAt(endIndex));
            }

            // 다음 검색을 시작할 위치 갱신
            startIndex = endIndex;
        }
        
        // List를 int 배열로 변환
        int[] answer = new int[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            answer[i] = ans.get(i);
        }

        return answer;
    }

 

ㅇ 다른분들의 풀이

class Solution {
  public int[] solution(String msg) {
    ArrayList<String> dic = new ArrayList<String>();
    ArrayList<Integer> result = new ArrayList<Integer>();

    for(int i = 0 ; i < 26; i++) {
        dic.add(String.valueOf((char)('A'+i)));
    }

    for(int i = 0 ; i < msg.length() ; i++) {
        for(int j = dic.size()-1 ; j >= 0 ; j--) {
            if(msg.substring(i).startsWith(dic.get(j))) {
                i += dic.get(j).length()-1;
                result.add(j+1);
                if(i+1 < msg.length())
                    dic.add(dic.get(j)+msg.charAt(i+1));
                break;
            }
        }
    }

    int[] answer = new int[result.size()];

    for(int i = 0 ; i < result.size() ; i++) 
        answer[i] = result.get(i);

    return answer;  
  }
}

얼추 비슷하게 푼거같긴하다. 다른풀이도 봤는데 나랑 비슷하게 풀었다.

'Java > 알고리즘' 카테고리의 다른 글

게임 맵 최단거리  (0) 2023.10.31
N진수 게임  (1) 2023.10.30
while문의 사용에 익숙해져보자  (0) 2023.10.25
Lv1로 쉬어가기 (5문제)  (0) 2023.10.25
알고리즘 공부(2) - 자료구조(리스트,세트,맵)  (0) 2023.10.24