[프로그래머스][JS]튜플

Kyle·2020년 12월 23일
0

problem solving

목록 보기
17/36
post-custom-banner

문제

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

해결방법

해결 로직
1. 받은 문자열을 배열로 만들어준다.
ex) {{1,3},{1}} => [[1,3],[1]]
2. 배열을 길이 순 오름차순으로 정렬한다
3. 배열들을 순회하며 최종 정답 배열과 비교해 중복되지 않은 것들만 push 한다.

각 단계를 자세하게 알아보자.

1. 받은 문자열을 배열로 만들어준다.

문자열에는 { / } / , / 숫자 이렇게 4종류의 문자가 있습니다. 각각의 경우마다 설정을 해줘야 합니다.

큰배열

1. {

새로운 배열의 시작이기 때문에 arrayList에 빈 배열을 넣어 줍니다.
continue

2. } && ,(comma)

이 두가지 경우 모두 arrayList의 마지막 요소배열에 쌓아온 숫자를 push 해주면 됩니다. (이 때 숫자로 넣어주기 위해 *1을 했습니다.)
그 후 임시문자열(tmpArr)을 초기화 해줍니다.

,(comma)일 때는 2가지 경우가 있습니다.
} 중괄호가 닫힌뒤 컴마 / 숫자 사이의 컴마

  • 중괄호가 닫힌뒤 컴마는 아무 일도 없습니다.
    continue 이지만 굳이 설정해주지 않았습니다.
  • 숫자 사이의 컴마는 숫자가 끝났다는 증거이기 때문에 arrayList의 마지막 요소배열에 임시문자열(숫자)를 push해줍니다.

3. 숫자

숫자일때 임시문자열(tmpStr)에 숫자를 계속 붙여줍니다.
,(comma)가 나와야 하나의 숫자가 끝나는 것이기 때문입니다.

2. 배열을 길이순으로 오름차순

문제에 배열의 길이가 1인 값부터 차근차근 넣어야 정답배열의 순서를 지킬 수 있습니다.

(튜플내에서 원소순서가 바뀔 수 있기 때문에)

arrayList.sort((a, b) => a.length - b.length);

sort를 이용해 정렬해 줍니다.

3.배열을 순회하며 정답배열 만들기

이제 arrayList에는 [ [ 2 ], [ 2, 1 ]] 이와같은 2차원 배열이 들어있습니다.

이때 정답배열을 구하기 위해서는 작은 길이가 1인 배열부터 접근해서 넣어줘야합니다.
ex)2->1->3->4
그렇기 때문에 arrayList를 순회하며 정답배열에 넣어줍니다. 예시를 보면 이해가 쉬울 겁니다.

ex)[ [ 2 ], [ 2, 1 ], [ 1, 2, 3 ], [ 1, 2, 4, 3 ] ]

answer=[]

  • [2] -> answer = [2]
  • [2,1] -> answer = [2,1]
  • [1,2,3] -> answer = [2,1,3]
  • [1,2,4,3] -> answer = [2,1,3,4]

즉, answer에 없는 값을 추가해줘야 되기 때문에 filter를 이용해 주어서 해결합니다.

code

function solution(s) {
  var arrayList = [];
  let strArr = s.split("");
  strArr = strArr.slice(1, strArr.length - 1);
  let tmpStr = "";
  for (let char of strArr) {
    if (char === "{") {
      arrayList.push([]);
    } else if (char === "}" || (char === "," && tmpStr)) {
      arrayList[arrayList.length - 1].push(tmpStr*1);//숫자로 만들어주기 위해
      tmpStr = "";
    } else if (!isNaN(parseInt(char))) { //숫자인지 판별
      tmpStr += char;
    }
  }
  arrayList.sort((a, b) => a.length - b.length);
  const answer = [];
  for (let x of arrayList) {
    x = x.filter((v) => !answer.includes(v));
    answer.push(x[0]);//answer과 비교하면 x의 요소는 한개만 남을 것이기 때문
  }
  return answer;
}
profile
Kyle 발전기
post-custom-banner

0개의 댓글