[Code Kata] Week 2 - Day 2

오지수·2021년 6월 30일
0

CodeKata

목록 보기
5/7
post-thumbnail

문제

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

예를 들어,

nums = [3,2,3]
return 3

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

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

Code

My Code

  • 객체를 이용해서 배열 안에 들어있는 값들을 하나의 키로 정하고 value로 그 값들이 몇 개가 들어있는지 저장한다면 풀 수 있을 것 같았다.
function moreThanHalf(nums) {
  
  if (nums.length >= 2) {
    const major = {}
    
    nums.filter((el, index) => {
      major[el] = (major[el])? (major[el]+1) : 1;
    });
	
    return major
  } else {
  	return 0;
  }
}
  • 객체에 배열에 들어있는 키를 넣어주는 것은 쉬웠지만 value를 어떻게 처리할지에 대해 생각하느라 시간이 오래 걸렸다.
  • major[el] = (major[el])? (major[el]+1) : 0; 처음에는 이런 식으로 풀었는데 이렇게 한다면 계속 0이 나오기 때문에 true일 때의 식이 평생 실행되지 않게된다.
  • 어차피 키가 들어왔다는 것은 최소한 값을 하나는 가지고 있다는 것이기 때문에 주어진 조건식이 false일 때 1이 값으로 저장되도록 한다면 인자로 받은 nums에서 숫자를 만날때마다 1씩 더하여 총 몇 개가 나왔는지 알 수 있게 된다.
  • 원래는 과반수가 넘은 숫자를 반환하는 것이기 때문에 객체 major를 출력하면 안된다.
  • 중간에 객체 안에 넣을 값을 해결했다는 것에 너무 기뻐서 열음님과 코드에 대한 이야기를 나누어 본 다음에 코드를 추가하였다.
function moreThanHalf(nums) {
  
  if (nums.length >= 2) {
    const major = {}
    
    nums.filter((el, index) => {
      major[el] = (major[el])? (major[el]+1) : 1;
    });
    
    const keys = Object.keys(major);
    const values = Object.values(major);
    const maxValues = Math.max(...values);
    
    for (let i in keys) {
      if (major[keys[i]] === maxValues) {
      return keys[i];
     }
    }
    
  }else{
    return 0;
  }
}
  • 과반수가 넘은 숫자를 반환하기 위해서 객체 major의 키와 value값을 배열로 만들어서 변수에 저장하였다.
  • 반복문으로 major에 저장된 키 값과 values에 저장된 값들 중에서 최댓값을 구하여 키 값과 최댓값이 같다면 해당 키를 출력한다.

추가로 알게 된 사실

코드 리뷰로 추가로 알게 된 사실이 있다.

nums.filter((el, index) => {
      major[el] = (major[el])? (major[el]+1) : 1;
    });

나는 위와 같이 이렇게 삼항 연산자를 사용하여 value 값을 결정하였는데 이것을 더 간단하게도 표현할 수 있다.

nums.filter((el, index) => {
      major[el] = (major[el] || 0) + 1;
    });

이 식도 내가 처음에 작성한 코드와 똑같이 동작된다.
major[el] 값이 없다면 0으로 시작하여 같은 값을 만나면 +1씩 증가시킨다.

profile
My Moto:: 내 스스로와 더불어 주변에게도 좋은 영향을 행사하도록 점검 & 노력..!!

0개의 댓글