코딩테스트/프로그래머스
[프로그래머스] 튜플 (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();
}
}