문제: https://programmers.co.kr/learn/courses/30/lessons/64065
해결 로직
1. 받은 문자열을 배열로 만들어준다.
ex) {{1,3},{1}} => [[1,3],[1]]
2. 배열을 길이 순 오름차순으로 정렬한다
3. 배열들을 순회하며 최종 정답 배열과 비교해 중복되지 않은 것들만 push 한다.
각 단계를 자세하게 알아보자.
문자열에는 { / } / , / 숫자 이렇게 4종류의 문자가 있습니다. 각각의 경우마다 설정을 해줘야 합니다.
큰배열
새로운 배열의 시작이기 때문에 arrayList에 빈 배열을 넣어 줍니다.
continue
이 두가지 경우 모두 arrayList의 마지막 요소배열에 쌓아온 숫자를 push
해주면 됩니다. (이 때 숫자로 넣어주기 위해 *1을 했습니다.)
그 후 임시문자열(tmpArr)을 초기화 해줍니다.
,(comma)일 때는 2가지 경우가 있습니다.
} 중괄호가 닫힌뒤 컴마 / 숫자 사이의 컴마
continue
이지만 굳이 설정해주지 않았습니다.push
해줍니다.숫자일때 임시문자열(tmpStr)에 숫자를 계속 붙여줍니다.
,(comma)가 나와야 하나의 숫자가 끝나는 것이기 때문입니다.
문제에 배열의 길이가 1인 값부터 차근차근 넣어야 정답배열의 순서를 지킬 수 있습니다.
(튜플내에서 원소순서가 바뀔 수 있기 때문에)
arrayList.sort((a, b) => a.length - b.length);
sort
를 이용해 정렬해 줍니다.
이제 arrayList
에는 [ [ 2 ], [ 2, 1 ]] 이와같은 2차원 배열이 들어있습니다.
이때 정답배열을 구하기 위해서는 작은 길이가 1인 배열부터 접근해서 넣어줘야합니다.
ex)2->1->3->4
그렇기 때문에 arrayList
를 순회하며 정답배열에 넣어줍니다. 예시를 보면 이해가 쉬울 겁니다.
ex)[ [ 2 ], [ 2, 1 ], [ 1, 2, 3 ], [ 1, 2, 4, 3 ] ]
answer=[]
즉, answer에 없는 값을 추가해줘야 되기 때문에 filter
를 이용해 주어서 해결합니다.
function solution(s) {
var arrayList = [];
let strArr = s.split("");
strArr = strArr.slice(1, strArr.length - 1);
let tmpStr = "";
for (let char of strArr) {
if (char === "{") {
arrayList.push([]);
} else if (char === "}" || (char === "," && tmpStr)) {
arrayList[arrayList.length - 1].push(tmpStr*1);//숫자로 만들어주기 위해
tmpStr = "";
} else if (!isNaN(parseInt(char))) { //숫자인지 판별
tmpStr += char;
}
}
arrayList.sort((a, b) => a.length - b.length);
const answer = [];
for (let x of arrayList) {
x = x.filter((v) => !answer.includes(v));
answer.push(x[0]);//answer과 비교하면 x의 요소는 한개만 남을 것이기 때문
}
return answer;
}