프로그래머스 - 튜플
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
class Solution {
public int[] solution(String s) {
s = s.replace("{", "");
s = s.substring(0, s.length() - 2);
String[] eachSet = s.split("},");
Arrays.sort(eachSet, (s1, s2) -> s1.length() - s2.length());
Set<Integer> resultTuple = new LinkedHashSet<>();
for (String set : eachSet) {
String[] setInNumbers = set.split(",");
for (String number : setInNumbers) {
resultTuple.add(Integer.parseInt(number));
}
}
return resultTuple.stream()
.mapToInt(Integer::intValue)
.toArray();
}
}
- 문제를 잘 읽어야 하는 문제
- 튜플
- 원소의 순서가 다르면 서로 다른 튜플
- 중복된 원소가 없는 튜플 (a1, a2, a3, .., an)일때 아래의 Set으로 표현 가능
- 즉, 튜플이 주어지면 set으로 아래와 같이 표현 가능함
- {a1}, {a1, a2}, ... {a1, a2, ..., an}
- 각각의 Set들은 순서가 상관 없어서 바뀌어도 동일함
- 즉 튜플이 주어졌을 때, 그 튜플로 만들 수 있는 Set s를 주고 튜플을 찾으라는 문제
- 만들 수 있는 Set s 내부에 있는 Set들은 순서 변경이 가능하다
- 예제 2번째 것을 보면
-"{{1,2,3},{2,1},{1,2,4,3},{2}}"
- {2}, {2,1}, {1,2,3}, {1,2,4,3} 순으로 정렬할 수 있다.
- 위에서 튜플 (a1, a2, a3, ..., an) -> {a1}, {a1, a2}, .. {a1, a2, ..., an} 집합 형태로 표현 가능이니
- 원소가 1개씩 늘어는 순으로 튜플 형성됨
- 따라서 이전 Set에 있는 숫자에서 추가된 숫자가 튜플에 추가되는 수가 된다({2}, {2, 1} => 튜플 번환 시 (2, 1))
- 최종 풀이
eachSet : 문제에서 주어진 s에서 숫자와 콤마로 구분하고 각각의 Set을 String 배열로 구분
- 구분하고, 길이가 짧은 순으로 정렬한다.
- 예제 3 : "{{20, 111}, {111}}" -> [111], [20, 111] => 각각의 Set에서는 순서 바꿀 수 있으니 -> [111], [111, 20](순서 변경) 과 같음 => 튜플 변환 : (111, 20)
resultTuple :
- 각 Set의 추가되는 숫자 1개씩을 중복 없이 추가해야 최종 튜플
- 순서도 중요하기에 LinkedHashSet 이용