본문 바로가기

Algorithm(Javascript)

알고리즘 문제 9

 

1.  풀이1

function topK(nums, k) {
  const setArr = new Set(nums)
  let countObject = {}
  let answer = []
  let valueBox = []
  
  for(const value of setArr) {
    countObject[value] = 0
  }
  
  for(const value of nums) {
    countObject[value] += 1
  }
  
  for(const key in countObject) {
    valueBox.push(countObject[key])
  }
  
  valueBox = valueBox.sort((a, b) => b - a);
  
  for(let i=0; i<k; i++) {
    for(const key in countObject) {
      if(countObject[key] === valueBox[i] &&
       answer.indexOf(Number(key)) === -1) {
        answer.push(Number(key))
      }
    }
  }
  return answer
}

 

첫번째 풀이는 빈 객체에다가 배열내에 숫자가 얼마나 반복됐는지 카운팅을한 후 해결하는 풀이다.

첫번째 반복문은 set자료형으로 nums배열에서 중복된 값을 제거한걸 순회하면서 값의 value를 0으로 초기화시킨 작업이다.

두번째 반복문은 nums를 순회하면서 숫자의 개수를 카운팅한 작업 그리고 세번째 반복문은 객체의 value값들을 

valueBox라는 빈 배열에 넣어준 작업이다.

 

예를 들어서 nums = [1,1,1,1,2,2,3,3,3,5]라면 setArr에는 [1,2,3,5]가 할당이 되고 countObject에는 {'1': 4, '2': 2, '3':3, '5': 1}

valueBox는 [4, 2, 3, 1]배열이 할당되어있다. valueBox를 오름차순으로 나열하기 위해서 sort메소드를 사용했다.

그래서 현재 valueBox는 오름차순인 [4, 3, 2, 1]이렇게 할당되어있다.

 

다음 for문은 함수로 인자로 받은 k만큼 반복하는데 이는 k개만큼 값을 추출하기 위해서이다. for...in문으로 countObject의 키값을

순회하면서 해당 키값의 value값이 valueBox의 i번째 인덱스의 값과 같고 answer이라는 배열에 없는 값이면 넣어주는 로직이다.

Number(key)를 해준거는 처음에 countObject에 키값을 설정해줄때 숫자가 문자열 형태로 들어가기때문에 다시 숫자열로

변환시켜서 넣어주기 위해 써준거다. 그래서 answer배열에는 [1, 3]이 할당되고 이를 반환하면서 함수가 종료된다.

 

2.  풀이2

function topK(nums, k) {
  let setArr = [...new Set(nums)];
  let arrCollec = [];
  let answer = [];
  
  for(let i in setArr){
    let numArr = [...nums.filter(item =>item === setArr[i] )];
    arrCollec.push(numArr);
  }
  
  arrCollec.sort((a,b) => b.length-a.length);
  
  for(let j=0; j<k; j++){
    answer.push(arrCollec[j][0])
  }
  
  return answer
}

 

이 풀이방법은 객체를 쓰지않고 배열로만 해결한 풀이법이다. setArr 변수에는 nums를 set자료형을 적용시킨 배열을

복사해서 할당해준다. setArr을 순회하면서 numArr에 같은 숫자만 모인 배열을 할당한후 이 배열을 다시 arrCollec에다가

push해준다. 그리고 arrCollec배열안에 있는 배열들을 길이를 기준으로 오름차순으로 해준다.

 

마지막으로 k번만큼 arrCollec에 있는 첫번째 인자를 answer 빈 배열에 push를 해주면 답이 반환된다.

 

만약 nums가 [1,1,1,2,2,2,2,3,3,4,5]가 할당되어 있다면 arrCollec에는 [[2,2,2,2], [1,1,1], [3,3], [4], [5]] 가 할당되어있는 상태.

이를 0번 인덱스부터 k번 인덱스 전까지 해당 배열의 첫번째 값을 반환해주면 answer 배열에는 [2, 1]이 반환된다.

 

스프레드문법과 배열로만 풀이한 깔끔한 풀이방법이다..

'Algorithm(Javascript)' 카테고리의 다른 글

알고리즘 문제 11  (0) 2021.11.03
알고리즘 문제 10  (0) 2021.11.01
알고리즘 문제 8  (0) 2021.10.27
알고리즘 문제 7  (0) 2021.10.26
알고리즘 문제 6  (0) 2021.10.25