[프로그래머스] 2019 카카오 개발자 겨울 인턴십 - 튜플(JavaScript)

heumheum2·2020년 5월 2일
0

코딩테스트

목록 보기
2/5
post-thumbnail

📚 문제

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

  • (a1, a2, a3, ..., an)

튜플은 다음과 같은 성질을 가지고 있습니다.

  1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
  2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
  3. 튜플의 원소 개수는 유한합니다.

[입출력 예]

|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()함수를 이용해 차집합을 구현한 것으로 보입니다.

코드를 비교해보았을 때, 다른 사람이 푼 방식이 가독성도 좋고 깔끔해보이네요.. 문자열을 배열로 변경하는데 좀 시간이 많이 걸렸는데 더 연습이 필요할 것 같습니다.

📃 링크

2019 카카오 개발자 겨울 인턴십 - 튜플

profile
커피가 본체인 개발자 ☕️

0개의 댓글