프로그래머스/자바 Lv2

[프로그래머스] Java Lv2. 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [3차] 압축 17684

행수쌤 2024. 11. 4. 14:54
728x90
반응형

문제설명

  1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
  2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
  3. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
  4. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
  5. 단계 2로 돌아간다.

접근방법

  1. 문제를 잘 이해하는게 중요...
  2. 사전 색인 번호 등록을 위해 HashMap<String, Integer> 사용

핵심로직

  1. for를 사용하여 탐색 시작할 i 관리
  2. while을 사용하여 현재 i 부터 미등록 문자열이 아니기 전( i + length)까지 문자열을 찾은 후 색인 번호 반환
  3. i ~ i + length + 1 까지의 문자열은 색인 번호 추가 등록
  4. i + length + 1 부터 1번 과정 반복

입출력 예

  • msg = "KAKAO"
  • answer = [11, 1, 27, 15]

코드 작성

import java.util.*;

class Solution {
    public int[] solution(String msg) {
        Map<String, Integer> indexMap = new HashMap<>();
        for (int i = 0; i < 26; i++) {
            indexMap.put(String.valueOf((char) ('A' + i)), i + 1);
        }

        List<Integer> answerList = new ArrayList<>();
        int index = 27;  // 알파벳 A~Z 인덱스는 1~26이므로, 그 다음은 27부터 시작

        for (int i = 0; i < msg.length(); ) {
            String temp = "";
            int length = 0;

            // 가장 긴 일치 문자열을 찾음
            while (i + length < msg.length() && indexMap.containsKey(temp + msg.charAt(i + length))) {
                temp += msg.charAt(i + length);
                length++;
            }

            // 일치 문자열의 인덱스를 저장
            answerList.add(indexMap.get(temp));

            // 새로운 패턴을 추가
            if (i + length < msg.length()) {
                indexMap.put(temp + msg.charAt(i + length), index++);
            }

            i += length;  // 위치를 업데이트
        }

        // 리스트를 배열로 변환하여 반환
        return answerList.stream().mapToInt(Integer::intValue).toArray();
    }
}
728x90
반응형