[프로그래머스] level2 - 튜플(js)

swanious·2021년 7월 25일
0
post-custom-banner

문제 링크 👉 https://programmers.co.kr/learn/courses/30/lessons/64065

🐾 문제설명

제한사항에 해답에 필요한 중요한 정보들이 주어진다.

s의 길이는 5 이상 1,000,000 이하입니다.
s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
숫자가 0으로 시작하는 경우는 없습니다.
s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.

제한사항 중 s는 항상 중복되는 원소가 없는 튜플을 표현한다 라는 부분이 있는데,
이 때문에 문자열을 정규표현식으로 배열 형태로 변환해주고, 각 집합의 길이를 기준으로 정렬하기만 하면 이후 정렬된 배열을 돌면서 answer에 추가해주기만 하면 된다.

문제의 예시를 보면, 아래와 같은 예시가 주어지는데, 각 집합의 원소의 순서는 섞일 수 있다.

{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}} --> 이것을 예시로 보자.

이를 iterable로 변환시켜주기 위해 정규표현식과 split 메서드로 배열화하고, 각 집합의 길이를 기준으로 정렬하면 아래와 같이 나온다.

[[2], [2, 1], [1, 2, 3], [1, 2, 4, 3]]

위처럼 정렬된 배열을 순회하면서 answer배열에 포함되지 않은 숫자만 answer배열에 추가해주면 답을 구할 수 있다.

배열을 순회하면

  • [2] -> answer = [2]
  • [2, 1] -> answer = [2, 1] --> 이미 2가 있으므로 1만 추가
  • [1, 2, 3] -> answer = [2, 1, 3] --> 이미 2, 1이 있으므로 3만 추가
  • [1, 2, 4, 3] -> answer = [2, 1, 3, 4] -> 이미 2, 1, 3이 있으므로 4만 추가

🐾 나의 코드

function solution(s) {
    var answer = [];
    // { 가 있거나, }로 끝나는 정규표현식
    const regex = /\}$|\{/g
    
    // , 로 시작하는 정규표현식
    const regex2 = /^,/g
    
    // 정규표현식에 따라 새로운 배열 생성. 
    // 예시) {{20, 111}, {111}} 의 경우 ['20,111', '111', '']로 변경
    s = s.replace(regex, '');
    s = s.split('}')
    s.forEach((v,i) => {
        if (regex2.test(v)) {
            s[i] = v.replace(regex2, '')
        }
    })
    console.log(s)
    // s 배열의 맨 끝은 공백이므로 제거해주고 각 숫자마다 배열로 변환
    let newArr = s.slice(0, s.length-1);
    console.log(newArr)
    
    newArr.map((v, i) => {
        newArr[i] = v.split(',');
    })
    
    // 배열의 길이 기준으로 정렬한다.
    newArr.sort((a, b) => a.length - b.length)
    
    newArr.map((arr, i) => {
        arr.map(v => {
            if (!answer.includes(parseInt(v))) answer.push(parseInt(v))
        })
    })
    return answer;
}
profile
TIL 기록을 위한 블로그
post-custom-banner

0개의 댓글