728x90
SMALL
문제 이해
- A - Z 까지 대문자 사전이 1 ~ 26까지 색인번호를 가지고 있다.
- 문자열에서 첫글자 다음글자를 자르고 사전과 비교하였을때 사전에 미존재하면 색인번호를 올려서 새로 추가한다.
- 사전에 없는 문자가 나올때까지 계속 자른다.
- 문자열은 1000글자 이하로 이중for문을 사용하였다.
- map에다 A-Z를 키로 색인번호를 value로 생성, 추가되는 사전단어가 나올때마다 색인번호를 올려서 추가
- 색인번호가 신규 추가가 되면 기존에 사용한 영문자는 사용하면 안된다. cnt에 사용한 영문자의 수를 체크하여 사용못하게 넘어간다.
- 영문자 tmp 가 msg의 마지막 영문자를 사용하고 해당 문자열이 키에 존재한다면 문자열의 색인번호를 집어넣고 for문을 끝낸다.
import java.util.*;
class Solution {
public int[] solution(String msg) {
Map<String, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList();
int num = 27;
char ch = 'A';
// 사전에 영문자, 색인번호 추가
for(int i=1;i<=26;i++) {
map.put(String.valueOf(ch), i);
ch++;
}
int cnt = 0;
// A - 26
for(int i = 0; i<msg.length(); i++){
String tmp = "";
int check = 0;
if(cnt > 0){
cnt--;
continue;
}
for(int j = i; j<msg.length(); j++){
tmp += msg.substring(j, j+1);
// 마지막 체크
if(j == msg.length() - 1 && map.containsKey(tmp)){
list.add(map.get(tmp));
check = 1;
break;
}
if(map.containsKey(tmp)){
continue;
}else{
map.put(tmp, num++);
list.add(map.get(tmp.substring(0, tmp.length()-1)));
cnt = tmp.length()-2;
break;
}
}
if(check == 1) break;
}
int[] answer = new int[list.size()];
for(int i = 0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
728x90
LIST
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 땅따먹기 - Java(자바) (0) | 2024.04.02 |
---|---|
[프로그래머스] 방문 길이 - Java(자바) (1) | 2024.04.01 |
[프로그래머스] k진수에서 소수 개수 구하기 - Java(자바) (0) | 2024.03.28 |
[프로그래머스] [1차]뉴스 클러스터링 - Java(자바) (0) | 2024.03.28 |
[프로그래머스] 피로도 - Java(자바) (0) | 2024.03.28 |