본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 튜플

by StelthPark 2022. 3. 7.
function solution(s) {
  s = s.split("},{");
    
  let newArr = s.map((el) => {
    if (el[0] === "{" || el[1] === "{") {
      return el.slice(2);
    }
    if (el[el.length - 1] === "}" || el[el.length - 2] === "}") {
      return el.slice(0, -2);
    } else return el;
  });
  
  let convert = [];
  for (let i = 0; i < newArr.length; i++) {
    let pushArr = [];
    for (let j = 0; j < newArr[i].split(",").length; j++) {
      pushArr.push(parseInt(newArr[i].split(",")[j]));
    }
    convert.push(pushArr);
  }

  convert.sort(function (a, b) {
    if (a.length > b.length) return 1;
    if (a.length === b.length) return 0;
    if (a.length < b.length) return -1;
  });

  if (convert.length === 1) {
   return ([Number(convert.join(""))]);
  } else {
    let result = [];
    for (let i = 0; i < convert.length - 1; i++) {
      result.push(
        Number(
          convert[i + 1].filter(function (x) {
            if (convert[i].includes(x) === false) {
              return x;
            }
          })
        )
      );
      if (i === convert.length - 2) result.unshift(Number(convert[0]));
    }
    return result;
  }
}

처리조건

풀이

우선 문자열로 들어오는 각 원소들을 이차원 배열 형태로 만들어줬다. split("},{")를 통해 쪼개면 결과로 아래와 같이 된다

여기서 앞{{와 }}를 삭제해야하므로 map함수를 사용해 각 el마다 { 나 } 가 있을 시 slice로 잘라내고 리턴하여준다.

결과로 아래를 받을 수 있다. 이제 안에 든 el들을 배열로 넣어서 이차원 배열 형태로 만들어주자.

각 el 마다 split(",")를 하여 , 가 있을 시 배열로 나누어서 표현되고 나타난 배열에서 각 숫자들을 parseInt로 정수로 하여 준비 된 pushArr배열에 담아 준다. El이 한번씩 돌 때마다 pushArr을 convert 배열에 적재한다.

 

이로써 convert배열이 완성 됐고 만들려고 했던 이차원배열이 생성됐다.

자 이제 튜플이 만들어지는 테스트케이스를 참고해보자 아래 그림처럼  가장 작은 요소가 들어있는 배열(난 배열로 만들었으니..) 부터 다음 크기의 배열요소와 교집합을 하여 해당하지 않는 부분만이 result에 쌓는다. 그럼 어떻게 해야할까? 우선 배열길이순으로 sort를 하고 차례대로 하나씩 다음 인덱스와 비교하여 교집합이 아닌부분을 쌓으면 될 것이다.

 

sort를 통해 배열 길이를 기준으로 오름차순 정렬을 하였고 만약 배열길이가 1개라면 그대로 숫자로 타입을 바꾸어 배열에 담아 리턴하면된다. 길이가 2이상이라면 교집합으로 다음인덱스 배열에 현재 인덱스배열을 교집합으로 찾아 아닌 것을 Number타입으로 결과에 푸시한다. 여기서 주의 할 점은 다음 인덱스에 현재인덱스를 비교하니 인덱스 0 의 요소는 들어가지 않을 것이다. 그래서 for문이 모두 끝날때 결과 맨 앞에 unshift로 인덱스0의 요소를 삽입 해주었다.

 

for문을 여러번 돌려서 그런지 속도 문제가 있는거 같다 테스트는 잘 통과하지만 뒤로 갈수록 통과속도가 느려진다. for문을 많이 쓴것은 가독성보다도 단계별로 처리하려고 했던점이 있지만 속도문제도 해결해야 할 것 같다.

댓글