코딩테스트/프로그래머스

[프로그래머스] 튜플 (Lv.2)

34suuuuu 2025. 3. 29. 09:11

✴️ 문제

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

✴️ 문제 풀이

 

전체적인 풀이 과정을 먼저 살펴보면

1. 입력값에 대해서 부분집합 배열 생성

2. 부분집합 배열을 길이 오름차순 정렬

3. 부분집합 배열 원소들을 튜플 리스트에 없으면 삽입, 있으면 continue;

4. 튜플 리스트 배열로 변환해 return

 

이 문제에서 어려운 점은 입력값을 배열로 바꾸는 부분일것이라 생각한다.

한단계씩 처리 과정을 살펴보면 아래와 같다.

// 입력값 "{{4,2,3},{3},{2,3,4,1},{2,3}}"	   
String[] substring = s.substring(2, s.length()-2);

// "[{4,2,3},{3},{2,3,4,1},{2,3}]"	   
substring = s.split("\\},\\{");

// ["4,2,3", "3", "2,3,4,1", "2,3"]

 

특히 이 부분을 주의해서 살펴보면

입력값에서 맨앞과 맨뒤의 괄호는 제외하고 내부의 부분집합만 필요하기 때문에 문자열을 slicing할 수 있는 `substring`을 사용했다. 

그 이후에는 `{`과 `}`로  구분자를 지정해줘서 분할했다.

** `{`과 `}`는 특수문자이기 때문에 구분자로 지정해줄 때 반드시 `\\{`  `\\}`로 표기해줘야한다.

 

그리고 튜플 생성시 순서가 바뀌는 것을 주의하면서 

부분집합을 다시 배열로 만들어서 튜플에 존재하지 않는 원소만 튜플 리스트에 추가해주면 통과할 수 있다.

 

✴️ 전체 코드 (Java)

import java.util.*;

class Solution {
    public int[] solution(String s) {
       
        String[] substring = s.substring(2, s.length()-2).split("\\},\\{");     
        
        Arrays.sort(substring, new Comparator<String>(){
            @Override
            public int compare(String o1, String o2){
                return o1.length() - o2.length(); 
            }
        });
        
        ArrayList<Integer> tuples = new ArrayList<>();
        for(String str: substring){
            String[] elements = str.split(",");
            
            for(String element : elements){
                int num = Integer.parseInt(element);
                if(tuples.contains(num))continue;
                tuples.add(num);
            }
        }
        
        return tuples.stream().mapToInt(Integer::intValue).toArray();
    }
}