ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JavaScript] 튜플 (Feat. replace?, Set?)
    IT Study/프로그래머스 2023. 12. 3. 18:57
    728x90

     

    위 문제 풀이 시작합니다.

     

    👿 1. 문제 접근

    "일단 저 요상한 데이터 형식을 배열 안의 배열 형식으로 바꿔야겠다!" 고 생각했습니다.

    (1) 맨 앞, 맨 뒤에 중괄호 2개를 빼자.
    {{2},{2,1},{2,1,3},{2,1,3,4}} → 2},{2,1},{2,1,3},{2,1,3,4

    (2) 모든 { 를 빼자.
    2},{2,1},{2,1,3},{2,1,3,4 → 2},2,1},2,1,3},2,1,3,4

    (3) `},`가 마치 / (슬래시)와 같이 문자들을 구분해주니, 이 구분자를 기준으로 문자열을 분할하여 배열에 담자.
    2},2,1},2,1,3},2,1,3,4 → [ '2', '2,1', '2,1,3', '2,1,3,4' ]

    (4) 분할된 문자열의 배열을 배열 안의 배열로 변환하자.
    [ '2', '2,1', '2,1,3', '2,1,3,4' ] → [ [ '2' ], [ '2', '1' ], [ '2', '1', '3' ], [ '2', '1', '3', '4' ] ]
    function solution(s) {
        var answer = [];
        // 1. {{ }} 맨 앞/뒤 중괄호 2개 빼기
        const sLength = s.length;
        const s1 = s.slice(2, sLength - 2);
    
        // 2. '{' 빼기
        const s2 = s1.replaceAll("{", "");
    
        // 3. ,(콤마) 기준 자르고 배열에 담기
        const arr = s2.split("},");
    
        // 4. 배열 안의 배열로 만들기
        let arrInArr = [];
        for (let i = 0; i < arr.length; i++) {
            const item = arr[i];
            arrInArr.push(item.split(","));
        }
    
        return answer;
    }

     

    👍🏻 2. 문제 해결 (결과 코드)

    "각 배열의 길이를 기준으로 정렬하고,

    정렬된 배열을 순회하며 중복되지 않는 요소를 추출하여 숫자로 변환하고, 이를 answer 배열에 추가하자."

    function solution(s) {
        var answer = [];
        // 1. {{ }} 맨 앞/뒤 중괄호 2개 빼기
        const sLength = s.length;
        const s1 = s.slice(2, sLength - 2);
    
        // 2. '{' 빼기
        const s2 = s1.replaceAll("{", "");
    
        // 3. ,(콤마) 기준 자르고 배열에 담기
        const arr = s2.split("},");
    
        // 4. 배열 안의 배열로 만들기
        let arrInArr = [];
        for (let i = 0; i < arr.length; i++) {
            const item = arr[i];
            arrInArr.push(item.split(","));
        }
    
        // 5. 각 요소 길이 순으로 나열하기
        const sortArr = arrInArr.sort((x, y) => x.length - y.length)
    
        // 6. 배열 돌며 answer에 push()
        let beforeArr = [];
        for (let i = 0; i < sortArr.length; i++) {
            const item = sortArr[i];
            const pushItem = item.filter(x => !beforeArr.includes(x)).join();
            answer.push(+pushItem);
            beforeArr = item;
        }
    
        return answer;
    }

     

    🧪 3. 테스트 결과

    생각보다 시간과 메모리가 많이 사용되었는데요. 다른 이들의 코드를 살펴보겠습니다.

     

    🤷🏻‍♀️ 4. 다른 이들의 코드

    (1) 데이터 형식을 배열 안의 배열 형식으로 한번에 바꾸기

    아래는 제 코드입니다.

    function solution(s) {
        var answer = [];
        // 1. {{ }} 맨 앞/뒤 중괄호 2개 빼기
        const sLength = s.length;
        const s1 = s.slice(2, sLength - 2);
    
        // 2. '{' 빼기
        const s2 = s1.replaceAll("{", "");
    
        // 3. ,(콤마) 기준 자르고 배열에 담기
        const arr = s2.split("},");
    
        // 4. 배열 안의 배열로 만들기
        let arrInArr = [];
        for (let i = 0; i < arr.length; i++) {
            const item = arr[i];
            arrInArr.push(item.split(","));
        }
    
        return answer;
    }

     

    아래 코드 보시죠. 제 코드를 단 2줄로 줄였습니다.

    {} 중괄호를 [] 대괄호로 대체하고, JSON.parse() 메서드를 사용하여 문자열을 배열로 변환하다니...

    function solution(s) {
        var answer = [];
        
        const newS = s.replace(/{/g, '[').replace(/}/g, ']');
        const arrInArr = JSON.parse(newS);
    
        return answer;
    }

     

    테스트케이스 7-14까지 소요된 시간을 비교하면, 시간은 1/2.. 아니 1/3 수준입니다.

     

    (2) Set 활용하기

    다른 분들의 코드를 보다보니, Set을 사용한 분들이 있더군요.

    아래는 역시 제 코드입니다.

    function solution(s) {
        var answer = [];
        
        const newS = s.replace(/{/g, '[').replace(/}/g, ']');
        const arrInArr = JSON.parse(newS);
        
        let beforeArr = [];
        for (let i = 0; i < sortArr.length; i++) {
            const item = sortArr[i];
            const pushItem = item.filter(x => !beforeArr.includes(x));
            answer.push(+pushItem);
            beforeArr = item;
        }
    
        return answer;
    }

     

    중복이 불가능하다는 Set의 특징을 사용한 코드이네요.

    function solution(s) {
        var answer = [];
        
        const newS = s.replace(/{/g, '[').replace(/}/g, ']');
        const arrInArr = JSON.parse(newS);
        
        const sortArr = arrInArr.sort((x, y) => x.length - y.length);
        
        const set = new Set();
        for (let i = 0; i < sortArr.length; i++) {
            const item = sortArr[i];
            item.map((it, idx) => set.add(it))
        }
        
        answer.push(...set);
        
        return answer;
    }

     

    속도 면에서도 엄청나게 빠른 모습을 보입니다.

     

    그러나 Set은 요소의 순서가 보장되지 않는 자료 구조이기 때문에,

    순서가 중요한 문제인 만큼 Set을 사용하기보다는 배열을 사용하는 것이 더 적합한 것으로 보이네요!

    (잘못된 지식이라면 바른 길로 지도 부탁들입니다 🙏🏻)

     

    👋🏻 마무리

    이렇게 오늘도 프로그래머스 문제를 풀어봤는데요. 아직까지는 매우 재밌는 듯 합니다...

    여러분 이번 글 봐주셔서 감사합니다. 다음 글에서 또 봬요⭐️

Designed by Tistory.