기본 원리
원소의 순서가 바뀌어도 되기 때문에 복잡해 보이지만
순서를 알파벳 순서대로 정렬한다면 쉽게 이해할 수 있습니다.
(a) 튜플은 {{a}}
(a,b) 튜플은 {{a}, {a,b}}
(a,b,c) 튜플은 {{a},{a,b},{a,b,c}}
.
.
.
반복
(a,b,d,c,e) => {{a},{a,b},{a,b,c},{a,b,c,d},{a,b,c,d,e}}
문제에선 집합을 주면 튜플을 구하라고 하였으므로
{{a},{a,b},{a,b,c},{a,b,c,d},{a,b,c,d,e}}가 주어지면 [a,b,c,d,e]를 반환하면 됩니다.
관계를 찾아보면 튜플의 첫 번째인 a는 모든 집합에 포함됩니다.
두 번째인 b는 1개짜리 집합을 제외한 모든 집합에 포함됩니다.
즉, 주어진 문자열에서 제일 많이 포함되는 숫자가 튜플의 첫 번째가 될 것이고
그다음이 두 번째, 그다음은 세 번째... 반복 1개짜리가 튜플의 마지막이 될 것입니다.
풀이 순서
주어진 문자열에서 괄호 삭제
',' 쉼표로 split 하여 각 숫자들의 개수를 구하면 끝.
맵으로 카운트하는 방식 사용
map.put( 숫자, 개수++ );
이 맵을 통해 answer에 값들을 넣어서 반환하면 됩니다.
answer[숫자의 총 개수 - 개수] = 숫자;
※배열의 인덱스 값을 (숫자의 총 개수 - 개수)로 한 이유 : 인덱스 값을 제일 개수가 많은 것부터 역순으로 넣기 위해서입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int[] answer = {};
HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();
String[] strArray = s.replaceAll("\\{|\\}","").split(",");
for(String str : strArray) {
int key = Integer.parseInt(str);
int cnt = map.get(key) != null ? map.get(key) + 1 : 1;
map.put(key,cnt);
}
answer = new int[map.size()];
for(Entry<Integer, Integer> set : map.entrySet()) {
answer[map.size() - set.getValue()] = set.getKey();
}
return answer;
|
cs |
'PROGRAMMERS' 카테고리의 다른 글
신고 결과 받기 (0) | 2022.05.20 |
---|---|
예상 대진표 (0) | 2021.05.05 |
행렬 테두리 회전하기 (0) | 2021.04.30 |
큰 수 만들기 (0) | 2021.04.23 |
프린터 (0) | 2021.04.09 |
댓글