관리 메뉴

Mini

[틀림] [Java] 프로그래머스 튜플 // 문자열, LinkedHashSet 본문

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;
    }
}