👀 문제
https://programmers.co.kr/learn/courses/30/lessons/64065
👊 도전
1. 설계
- s안의 중괄호를 없애서 배열에 넣는다.
- 원소 길이의 오름차순으로 정렬한다.
- 정렬된 String 원소를 순회한다.
- 각 원소에서 ‘,’를 지우고 숫자만 남긴 후, 처음 보는 숫자이면 answer에 넣는다.
- 숫자 체크는 HashSet을 이용한다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
/**
*
* @author HEESOO
*
*/
class Solution {
public int[] solution(String s) {
int[] answer = {};
// 중괄호 없애기
s=s.substring(1,s.length()-1);
s=s.replaceAll("},|}", "");
s=s.substring(1,s.length());
String[] str=s.split("\\{");
// 길이 순으로 오름차순 정렬
Arrays.sort(str, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
if(s1.length()<s2.length()) return -1;
else if(s1.length()==s2.length()) return 0;
else return 1;
}
});
int n=str.length;
answer=new int[n];
HashSet<String> map=new HashSet<>(); // 숫자 체크 위함
for(int i=0;i<n;i++){ // 집합 순회
String[] now=str[i].split(","); // 숫자만 남기기
for(int j=0;j<now.length;j++){ // 숫자 순회
if(map.contains(now[j])) continue;
else { // 처음 보는 숫자이면 answer에 삽입
answer[i]=Integer.parseInt(now[j]);
map.add(now[j]); // 다음 비교를 위함
break;
}
}
}
return answer;
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 문자열을 쪼갠다
- 집합을 감싸는 ‘{}’를 없앤다.
- 집합이 끝나는 지점인 ‘},’과 맨 마지막 끝 ‘}’를 없앤다.
- 처음 시작하는 중괄호 ‘{‘를 업앤다.
- ’{‘ 기준으로 s를 쪼개서 배열에 저장한다.
- 이제 배열에는 숫자와 콤마만 들어가있다. ex) [“1,2”, “3”, …]
- 길이가 짧은 것부터 체크해야하므로 Comparator을 이용하여 길이순으로 오름차순 정렬한다.
- 해시셋을 이용하여 숫자를 체크한다
- 오름차순 정렬된 str을 인덱스 i로 순회한다.
- i번째 문자열의 숫자만 체크하기 위해 ‘,’ 기준으로 잘라 now 배열에 넣는다.
- now를 인덱스 j로 순회하며 now 집합 안의 숫자를 체크한다.
- HashSet을 이용하여 처음 보는 숫자이면 answer에 넣는다.
- 숫자는 중복이 없다고 했으므로 해시셋을 사용할 수 있다.
- 다음 비교를 위해 answer[i]에 넣은 값을 해시셋에도 저장해준다.