셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.
튜플은 다음과 같은 성질을 가지고 있습니다.
[입출력 예]
s | result |
---|---|
"{{2},{2,1},{2,1,3},{2,1,3,4}}" | [2, 1, 3, 4] |
"{{1,2,3},{2,1},{1,2,4,3},{2}}" | [2, 1, 3, 4] |
"{{20,111},{111}}" | [111, 20] |
"{{123}}" | [123] |
"{{4,2,3},{3},{2,3,4,1},{2,3}}" | [3, 2, 4, 1] |
위의 예시에서 객체의 크기 순으로 배열에 순서대로 쌓이는 것을 볼 수 있습니다. 따라서 문자열을 배열로 변환 후, 배열의 크기별로 정렬 후 배열의 차집합을 구해 결과 값을 반환하는 방법으로 접근했습니다.
function solution(s) {
const splitStr = s.split('},{');
const arrayList = parseArrayofSort(splitStr);
return arrayList.length === 1 ? arrayList : result(arrayList);
}
function parseArrayofSort(objStr){
if(objStr.length === 1){
const onething = objStr[0].substring(2, objStr[0].length-2);
return [+onething];
}
const parseArray = [];
objStr.forEach(v => {
let value;
if(v.includes('{{')){
value = stringToArray(v.substring(2));
}else if(v.includes('}}')){
value =stringToArray(v.substring(0, v.length-2));
}else{
value = stringToArray(v);
}
parseArray.push(value);
});
parseArray.sort(function(a, b){
if(a.length > b.length){
return 1;
}else return -1;
});
return parseArray;
}
function stringToArray(string){
return string.split`,`.map(v=> +v);
}
function result(list){
const resultArray = list.map((v,i,thing) => {
if(i !== 0 ){
let value = v.filter(x => !thing[i-1].includes(x))[0];
return value;
}else{
return v[0];
}
});
return resultArray;
}
"{{4,2,3},{3},{2,3,4,1},{2,3}}"
이 예제를 예시로 들겠습니다.
split
함수를 이용해 '},{'
을 제거하면 "{{4,2,3"
, "3"
, 2,3,4,1
, 2,3}}
으로 분리가 됩니다.
분리 된 것을 parseArrayofSort()
함수를 사용해 {{, }}
을 지운 후, 숫자를 배열에 집어 넣은 다음 [4,2,3],[3],[2,3,4,1],[2,3]
을 배열 크기 순으로 정렬하고 반환합니다.
반환 된 배열 원소들의 차집합을 배열로 만들어 문제를 해결했습니다.
const createSets = s =>
s
.slice(2, s.length - 2)
.split("},{")
.map(el => el.split(","));
const compare = (a, b) => a.length - b.length;
const solution = s => {
const sets = createSets(s).sort(compare);
let result = [...sets[0]];
for (let i = 1; i < sets.length; i++) {
for (const r of result) {
sets[i] = sets[i].filter(set => set !== r);
}
result.push(...sets[i]);
}
return result.map(el => parseInt(el));
};
저랑 비슷하게 푼 사람의 코드를 봤습니다.
slice()
와 split()
함수를 이용해 ["4,2,3", "3", "2,3,4,1", "2,3"]
으로 나누고, map()
함수로 2차원 배열을 만든 다음 정렬하였고, filter()
함수를 이용해 차집합을 구현한 것으로 보입니다.
코드를 비교해보았을 때, 다른 사람이 푼 방식이 가독성도 좋고 깔끔해보이네요.. 문자열을 배열로 변경하는데 좀 시간이 많이 걸렸는데 더 연습이 필요할 것 같습니다.