본문 바로가기
코딩 테스트/프로그래머스

[프로그래머스 - JavaScript] Lv.2 튜플

by 오엥?은 2023. 2. 11.
반응형

 

  • 문제

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 풀이
function solution(s) {
    
    let arr = s.replace(/{/g, " ");  // '{' 빈칸으로 바꾸기
    arr = arr.replace(/}/g, "");     // '}' 삭제
    arr = arr.trim();    // 문자열의 앞, 뒤 공백 삭제
    arr = arr + ', ';
    
    let tempList = [];  
    let tempList2 = [];  
    let index = 0;
    let len = 0;
    let num = "";
    
    for (let i of arr) {
        
        if (i === ',') {
            tempList2[index++] = parseInt(num);
            num = "";
        }
        else if (i !== ' ') num += i;
        else if (i === ' ') {
            if (tempList2.length > tempList.length) {
                tempList = tempList2
            }
            tempList2 = [];
            index = 0;
        }
    }

    return tempList;
}

이렇게까지 해야 겨우 중괄호 대괄호로 바꾸고 제일 긴 리스트 뽑아낼 수 있다.

이렇게 뽑았는데 리스트 안의 요소들 순서가 문제다. 이렇게 오류 나고 나서야 문제 완벽히 이해했다 사실 ㅎㅎ

며칠 고민했는데 모르겠길래 검색해봤다 ㅠ

 

function solution(s) {
    let answer = [];
    let tuples = s.slice(2, -2).split(/},{/g).sort((a, b) => a.length - b.length);

    tuples.forEach(v => {
        let tuple = v.split(',');
        answer.push(tuple.find(e => !answer.includes(e)));
    });

    return answer.map(e => Number(e));
}

이거 보니까 한없이 초라해졌다.

 

let a = '{{1}, {1, 2}}';
console.log(a.slice(2, -2));	// '1}, {1, 2'

일단 앞, 뒤 중괄호 두 개씩 있는 거 지운다. 여기서부터 소름돋았다.

console.log( a.slice(2, -2).split(/}, {/g) );	// ['1', '1, 2']

split 으로 문자열 분리하여 배열로 리턴한다.

split 도 까먹고 나 정말 기본기 조졌다.

let s = "{{1,2,3},{2,1},{1,2,4,3},{2}}";

s.slice(2, -2).split(/},{/g).sort((a, b) => a.length - b.length);
// ['2', '2,1', '1,2,3', '1,2,4,3']

마지막으로 요소의 길이를 기준으로 sort 해준다. 이걸 변수 tuples 에 담은거다.

 

let answer = [];

tuples.forEach(v => {
	let tuple = v.split(','); 
	answer.push(tuple);
	});

console.log(answer);	
// [['2'], ['2', '1'], ['1', '2', '3'], ['1', '2', '4', '3']]

그리고 이제 tuples 의 요소들을 하나하나 반복문 돌려서 ',' 를 기준으로 새로운 배열 tuple 을 만든 뒤 answer 배열에 push 해준다.

그러면 2차원 배열이 완성된다.

tuples.forEach(v => {
        let tuple = v.split(',');
        answer.push(tuple.find(e => !answer.includes(e)));
    });
    
console.log(answer);	// ['2', '1', '3', '4']

find 까지 넣으면 이런 결과가 나온다.

반복문을 돌리면서 answer이 같은 요소를 포함하지 않으면 push 하라는 건데 저렇게하면

문제가 원하는 순서대로도 들어가고 진짜 대박이다. 이걸 위해서 길이를 기준으로 sort 해줬구나

return answer.map(e => Number(e));
// [2, 1, 3, 4]

이건 모든 문자열 숫자로 바꾸는 거

이러면 정답 잘 나온다.

 

var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newNumbers = numbers.map( number => number *2 );

console.log(newNumbers);
// [2, 4, 6, 8, 10, 12, 14, 16, 18]

map 예시 이런 거다. 파이썬 zip이랑 비슷한 거 같다.

반응형