문제 링크 👉 https://programmers.co.kr/learn/courses/30/lessons/64065
제한사항에 해답에 필요한 중요한 정보들이 주어진다.
s의 길이는 5 이상 1,000,000 이하입니다.
s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
숫자가 0으로 시작하는 경우는 없습니다.
s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.
제한사항 중 s는 항상 중복되는 원소가 없는 튜플을 표현한다
라는 부분이 있는데,
이 때문에 문자열을 정규표현식으로 배열 형태로 변환해주고, 각 집합의 길이를 기준으로 정렬하기만 하면 이후 정렬된 배열을 돌면서 answer에 추가해주기만 하면 된다.
문제의 예시를 보면, 아래와 같은 예시가 주어지는데, 각 집합의 원소의 순서는 섞일 수 있다.
{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}} --> 이것을 예시로 보자.
이를 iterable로 변환시켜주기 위해 정규표현식과 split 메서드로 배열화하고, 각 집합의 길이를 기준으로 정렬하면 아래와 같이 나온다.
[[2], [2, 1], [1, 2, 3], [1, 2, 4, 3]]
위처럼 정렬된 배열을 순회하면서 answer배열에 포함되지 않은 숫자만 answer배열에 추가해주면 답을 구할 수 있다.
배열을 순회하면
function solution(s) {
var answer = [];
// { 가 있거나, }로 끝나는 정규표현식
const regex = /\}$|\{/g
// , 로 시작하는 정규표현식
const regex2 = /^,/g
// 정규표현식에 따라 새로운 배열 생성.
// 예시) {{20, 111}, {111}} 의 경우 ['20,111', '111', '']로 변경
s = s.replace(regex, '');
s = s.split('}')
s.forEach((v,i) => {
if (regex2.test(v)) {
s[i] = v.replace(regex2, '')
}
})
console.log(s)
// s 배열의 맨 끝은 공백이므로 제거해주고 각 숫자마다 배열로 변환
let newArr = s.slice(0, s.length-1);
console.log(newArr)
newArr.map((v, i) => {
newArr[i] = v.split(',');
})
// 배열의 길이 기준으로 정렬한다.
newArr.sort((a, b) => a.length - b.length)
newArr.map((arr, i) => {
arr.map(v => {
if (!answer.includes(parseInt(v))) answer.push(parseInt(v))
})
})
return answer;
}