문제
https://school.programmers.co.kr/learn/courses/30/lessons/64065
풀이
해당 문제를 처음 보았을 때 이해하기 어려웠는데 아래 두 입력케이스를 보면 이해할 수 있다.
{{2},{2,1},{2,1,3},{2,1,3,4}} --> [2, 1, 3, 4]
{{1,2,3},{2,1},{1,2,4,3},{2}} --> [2, 1, 3, 4]
두 케이스를 보면 결과가 같은데 2번째 케이스를 1번째 케이스처럼 원소의 개수대로 튜플을 크기순으로 정렬하고 보면
{{2},{2,1},{1,2,3},{1,2,4,3}} --> [2, 1, 3, 4]
이렇게 볼 수 있다.
첫번째에튜플에 2를 넣고
두번째에 튜플에는 2가 있으니 중복되에 1을 넣는다.
세번째에 튜플에는 2,1이 있으니 중복되어 3을 넣는다.
네번째에 튜플에는 2,1,3이 있으니 중복되어 4를 넣는다.
튜플에 2,1,3,4 순서대로 입력된다.
다른 예시를 살펴보자.
{{4,2,3},{3},{2,3,4,1},{2,3}} --> [3, 2, 4, 1]
먼저 튜플을 크기순으로 정렬하면 다음과 같다.
{{3},{2,3},{4,2,3},{2,3,4,1}}
이 상태에서 첫번째를 튜플에 넣으면 3
두번째는 튜플에 이미 3이 있으니 2
세번째는 튜플에 이미 3,2 가 있으니 4
네번째는 튜플에 이미 3,2,4 가 있으니 1을 넣으면
3,2,4,1 순으로 튜플에 입력된다.
이 과정을 아래의 코드로 나타내었다.
import java.util.*;
class Solution {
public int[] solution(String s) {
Set<String> set = new LinkedHashSet<>();
String[] tuple = s.substring(2, s.length()-2).split("},\\{");
Arrays.sort(tuple, (a,b) -> (a.length()-b.length()));
for(String str : tuple) {
String[] temp = str.split(",");
for(String tar : temp) {
set.add(tar);
}
}
int[] answer = new int[set.size()];
int idx = 0;
for(String setData : set) {
answer[idx++] = Integer.parseInt(setData);
}
return answer;
}
}
다른 풀이 - 1
이 풀이는 https://school.programmers.co.kr/learn/courses/30/lessons/64065/solution_groups?language=java
해당 페이지에서 가장 추천을 많이 받은 솔루션인데 set.add()의 반환결과를 통해 결과를 도출한다는점이 인상깊어 게시해보았다.
import java.util.*;
class Solution {
public int[] solution(String s) {
Set<String> set = new HashSet<>();
String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
Arrays.sort(arr, (a, b)->{return a.length() - b.length();});
int[] answer = new int[arr.length];
int idx = 0;
for(String s1 : arr) {
for(String s2 : s1.split(",")) {
if(set.add(s2)) answer[idx++] = Integer.parseInt(s2);
}
}
return answer;
}
}
다른 풀이 - 2
이 풀이도 마찬가지로 https://school.programmers.co.kr/learn/courses/30/lessons/64065/solution_groups?language=java
해당 페이지에서 가져온 솔루션이다.
자바의 Pattern, Matcher라는 클래스와 정규식을 이용해서 이용한 풀이다.
자바에서 정규식 관련 클래스를 처음 접했고 좀 더 알아봐야겠다.
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Solution {
public int[] solution(String s) {
Map<String, Integer> map = new HashMap<>();
Pattern pattern = Pattern.compile("[0-9]+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
String n = matcher.group();
map.put(n, map.getOrDefault(n, 0) + 1);
}
int size = map.size();
int[] answer = new int[size];
for (String key: map.keySet()) {
answer[size - map.get(key)] = Integer.parseInt(key);
}
return answer;
}
}
'Problem Solving > CT-Java' 카테고리의 다른 글
[프로그래머스/문자열] 17677 [1차] 뉴스 클러스터링 - JAVA (0) | 2023.09.18 |
---|---|
[프로그래머스/구현] 77485 행렬 테투리 회전하기 - JAVA (0) | 2023.09.16 |
[프로그래머스/문자열] 60057 문자열압축 - JAVA (0) | 2023.09.16 |
[SWEA/순조부] 6808: 규영이와 인영이의 카드게임 - 자바 (0) | 2022.08.28 |
[SWEA/구현] 무선 충전 [모의 SW 역량테스트] - 자바 (0) | 2022.08.27 |