Algorithm/문자열
[틀림] [Java] 프로그래머스 튜플 // 문자열, LinkedHashSet
Mini_96
2025. 5. 2. 16:39
https://school.programmers.co.kr/learn/courses/30/lessons/64065
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 시도1
잘한점 : 숫자1개부터 size를 1개씩 증가시키면서 새로나온 숫자들만 answer에 담으면 최적해임.
일단 밖의 {}를 제거하고, 괄호가 나올때까지 보고... 숫자들을 배열에 저장?
그후, 중복되는것을 완전탐색으로 제거하고... 너무 복잡, 시간복잡도도 터질것 같은데?
풀이
1. 일단 {{ }}를 모두제거한다.
2. 이후, " },{ " 기준으로 분할하면 깔끔하게 숫자만 추출할 수 있다.
참고로 }는 메타문자이기때문에 앞에 \\ 2개를 붙여줘야한다.
3. 길이순으로 정렬한다.
4. LinkedHashSet을 사용하면, 삽입시 중복을 자동으로 제거해준다. && for문에서 돌릴때 넣은 순서대로 나옴이 보장된다.
5. LinkedHashSet을 순회하면서 answer배열에 넣는다.
전체코드
import java.util.*;
class Solution {
static ArrayList<Integer> v = new ArrayList<>();
public int[] solution(String s) {
// 1) 외부 중괄호 제거
String trimmed = s.substring(2, s.length() - 2);
// System.out.println(trimmed);
// 2) "},{"로 분리하여 각 집합 문자열 획득
String[] parts = trimmed.split("\\},\\{");
// for(String part : parts){
// System.out.println(part);
// }
// 3) 원소 개수 기준으로 정렬
Arrays.sort(parts, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
});
// 4) 순서대로 숫자 추출
LinkedHashSet<Integer> set = new LinkedHashSet<>();
for (String part : parts) {
String[] nums = part.split(",");
for (String num : nums) {
set.add(Integer.parseInt(num));
}
}
// 5) LinkedHashSet을 int[]로 변환
int[] answer = new int[set.size()];
int idx = 0;
for (int num : set) {
answer[idx++] = num;
}
return answer;
}
}