CodeKata 3 - W2D2

Yonghyun·2021년 9월 29일
0

CodeKata

목록 보기
3/5

문제

숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.

예를 들어,

nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

가정

nums 배열의 길이는 무조건 2개 이상

첫번째 풀이

function moreThanHalf(nums) {
  let list = [];

  const set = [...new Set(nums)]

  for(let a = 0; a < set.length; a ++){
     list.push(nums.reduce((cnt, element) => cnt + (set[a] === element), 0));
  }

  const max = list.reduce( function (first, second) { return first > second ? first:second; });

  let maxNum = set[list.indexOf(max)];

  return maxNum
}

주어진 배열을 set 함수와 spread 연산자를 이용해서 중복을 제거한 새로운 배열 set으로 만들어 주었다.
( 요즘 spread 연산자에 꽂혀서 뭐만하면 spread 연산자로 펼쳐보고 시작한다..다양한 방법을 사용해보도록하자..🥲 )
여튼 그리고나서 새로운 배열 set에 for문을 돌려서 중복제거된 새로운 배열의 요소와 reduce 메소드를 이용하여 기존 nums 배열에서 뽑아낸 요소를 비교하여 같은 값을 가진 경우 초기값을 0으로 준 cnt가 1씩 증가하게 만들어서 그 cnt값을 list라는 빈배열에 push를 이용해 넣어주었다.
그리고 다시한번 reduce 메소드를 이용해서 list 배열안의 값들을 비교하여 최대값을 구하고 이를 max라는 변수에 할당해주었다.
마지막으로 list 배열안에서 max값의 index를 구하고 이 index값을 set 배열에 똑같이 index값으로 넣어서 maxNum 변수에 할당해주었다.

=> spread 연산자, reduce 메소드등 지금까지 많이 써보지 않았던 메소드들을 써보고 싶어서 일부러 이 메소드를 사용해서 풀이를 진행했다. 익숙하지 않아서 코드를 짜면서 예상치 못했던 에러들이나 원했던 값이 나오지 않는 경우가 있었지만 그런 과정을 겪고나니 이 메소드들이 조금은 익숙해진 느낌이다.
다 풀고 나서 코드를 봤는데 익숙하지 않은 메소드들때문일수도 있지만 지저분하고 뭔가 코드가 눈에 잘 안들어오는 느낌이어서 좀 더 익숙한 메소드들을 이용해서 두번째 풀이를 진행했다.

두번째 풀이

function moreThanHalf(nums) {
  let manyNum = [];

  const newNums = [...new Set(nums)];

  for(let a = 0; a < newNums.length; a++){
  manyNum = [...manyNum,nums.filter(i => i === newNums[a]).length]
  }

  let maxNum = manyNum.indexOf(Math.max(...manyNum));

  return newNums[maxNum];
}

첫번째 풀이에서와 마찬가지로 주어진 배열을 set 함수와 spread 연산자를 이용해서 중복을 제거한 새로운 배열 newNums로 만들어 주었다. nums 배열에 filter 메서드를 이용하고 for문을 사용해서 newNums 배열안의 요소들과 비교하고 .length를 이용해서 요소별 중복되는 개수를 manyNum 배열에 넣어주었다.
indexOf 메소드를 이용해서 manyNum 배열에서 최대값의 index 값을 확인하고 그 값을 maxNum이라는 변수에 할당해 준뒤 그 값을 이용해서 중복을 제거한 배열 newNums에 해당하는 index값의 요소를 return 해주었다.

=> reduce 보다는 조금 익숙한 메소드를 사용하여서 코드를 봤을때 얻고자 하는 값이 무엇인지 조금 더 쉽게 파악할 수 있었다. 그러나 불필요한 변수를 너무 많이 사용해준것 같기도 하고 그때그때 아이디어가 생각나는대로 코드를 추가해서 그런지 지저분한 느낌을 지울수가 없다....😭

세번째 풀이

function moreThanHalf(nums) {
  let manyNum = {};
  nums.forEach((x) => {
    manyNum[x] = (manyNum[x] || 0) + 1;
  })

	const value=Object.values(manyNum).sort((a,b) => {return b - a})[0];
	
	const max = Object.keys(manyNum).filter((e)=>manyNum[e]==value?true:false)[0]
  
	return Number(max)
}

우선 manyNum이라는 빈 객체를 만들어주고 배열 nums안의 요소들을 forEach를 통해 key값으로 요소를 value 값으로 nums 배열내에서 각 요소가 중복되는 개수를 넣어준다.
객체 manyNum의 value 값을 기준으로 sort 메소드를 이용해 내림차순으로 정렬하고 그 value값을 가진 manyNum 객체의 key 값을 filter를 이용해 구해준다. [0]을 써준 이유는 [0]을 써주지 않으면 배열값이기 때문에 배열안의 요소만 꺼내주기 위해 [0]을 사용했다.

=> 두번째 풀이까지는 혼자서 풀어본 방법들이고 마지막 풀이는 코드카타를 진행하면서 함께 풀어본 풀이였는데 전혀 생각조차 못했던 방법이었다.. react에서 컴포넌트를 사용하면서 그나마 map에는 조금 익숙해진 것 같기도 한데 forEach와도 친해지도록 하자. 문제풀이에 객체를 잘 사용하면 좀더 효과적이고 보기 좋은 코드가 되는 것 같다. 알고리즘 풀이에 객체를 많이 사용해보도록하자...


많은 문제를 풀어보자 ❓

profile
Life is all about timing.

0개의 댓글