반응형
문제 정보는 아래 링크를 확인해주세요!
[압축]
문제 접근 방법
- A~Z까지 인덱스 정보를 담고 있는 데이터 집합을 만들어준다.
- msg 문자열에 대해 한 문자씩 분기문을 돌면서
- 현재 w와 다음 문자인 c를 합한 wc를 만들어주고,
- wc가 인덱스에 포함되어 있지 않다면,
- 인덱스 정보에 wc를 포함해주고
- w에는 c를 넣어주고 다음 분기문을 돌리고
- wc가 인덱스에 포함되어 있다면,
- 현재 wc를 w에 넣어주고 다음 분기문을 돌린다.
- 분기문을 돌때마다 해당 인덱스에대한 순서를 결과 리스트에 담아준다.
[소스 코드]
package algorithm.programmers;
import java.util.*;
/*
* 2018 카카오 블라인드
* [3차] 압축
* */
public class Pro17684 {
public int[] solution(String msg) {
//인덱스 초기 셋팅
ArrayList<String> index = new ArrayList<>(Arrays.asList(new String[] {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V"
,"W","X","Y","Z"}));
//길이가 하나라면, 인덱스에서 해당 위치를 찾아서 반환
if (msg.length() == 1) {
int i = index.indexOf(msg);
return new int[] {i+1};
}
//결과를 담을 리스트. 사이즈가 가변이기 때문에 리스트로 선언
ArrayList<Integer> ans = new ArrayList<>();
int idx = 1;//분기문마다 검사를 진행할 위치
String w = ""+msg.charAt(0);
while(idx <= msg.length()) {
if (idx == msg.length()) {//더이상 찾을 단어가 없을 때,
ans.add(index.indexOf(w)+1);//현재 w의 인덱스를 결과 리스트에 추가하고 분기문 종료
break;
}
char c = msg.charAt(idx);//c에는 현재 검사를할 위치에 해당하는 단어를 넣어준다.
String wc = w+c;
if (index.contains(wc)) {//wc가 인덱스에 포함하고 있다면,
w = wc;//현재 wc와 다음 c를 합쳐줘야하기 때문에 w에 넣어준다.
idx++;//다음 단어 위치를 정해주고, 다음 분기문으로 간다.
continue;
}
index.add(wc);//wc를 포함하고 있지 않기 때문에 새롭게 인덱스에 추가해준다.
ans.add(index.indexOf(w)+1);//결과 리스트에 새롭게 추가해준 인덱스 번호를 추가한다.
w = ""+c;//인덱스를 추가했으므로, w는 현재 c로 다시 셋팅한다.
idx++;//다음 위치로 선정하고, 다음 분기문으로 간다.
}
//결과 리스트를 포맷에 맞게 결과 배열로 만들고 반환
int[] answer = new int[ans.size()];
for (int i = 0; i < answer.length; i++) answer[i] = ans.get(i);
return answer;
}
}
반응형
LIST
'알고리즘 > 연습문제' 카테고리의 다른 글
2019 카카오 블라인드 코딩테스트 - 오픈채팅방 (feat. Java) (0) | 2020.05.15 |
---|---|
2018 카카오 블라인드 코딩테스트 - [3차] n진수 게임 (feat. Java) (0) | 2020.05.14 |
2018 카카오 블라인드 코딩테스트 - [3차] 방금그곡 (feat. Java) (0) | 2020.05.14 |
2018 카카오 블라인드 코딩테스트 - [1차] 비밀지도 (feat. Java) (0) | 2020.05.13 |
2018 카카오 블라인드 코딩테스트 - [1차] 캐시 (feat. Java) (0) | 2020.05.13 |