프로그래머스/자바 Lv2
[프로그래머스] Java Lv2. 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [3차] 압축 17684
행수쌤
2024. 11. 4. 14:54
728x90
반응형
문제설명
- 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
- 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
- w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
- 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
- 단계 2로 돌아간다.
접근방법
- 문제를 잘 이해하는게 중요...
- 사전 색인 번호 등록을 위해 HashMap<String, Integer> 사용
핵심로직
- for를 사용하여 탐색 시작할 i 관리
- while을 사용하여 현재 i 부터 미등록 문자열이 아니기 전( i + length)까지 문자열을 찾은 후 색인 번호 반환
- i ~ i + length + 1 까지의 문자열은 색인 번호 추가 등록
- 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
반응형