코드카타 7일차

여리·2023년 1월 31일
0

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

예를 들어,

nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2
가정
nums 배열의 길이는 무조건 2개 이상


문제에 대해서는 forEach 메소드를 사용했다.

  1. result의 초기값을 객체로 설정하여 반복문을 돌리게 되면 객체의 형태로 각 배열의 i번째의 요소가 몇번 나왔는지 알 수 있다.
이부분은 참고로만 알고 있어도 좋을 것 같다.
값을 도출하는데에는 큰 의미는 없지만 참고해서 알게되면 흐름에 대해서 이해할 수 있게된다.
2. key 값은 배열 요소의 값 value의 값은 요소의 값이 몇 번이 도출됐는지를 알 수 있다.

3. value의 값을 Math.max 메소드를 사용하여 최대로 나온값을 알 수 있다.
  1. 다시 객체를 Object.entries 메소드를 사용하면 객체의 값을 key값와 value값이 모두 배열화 되게 된다.

  2. 반복문과 조건문을 활용하여 배열의 2번째해당하는 값 [i][1]이 value의 값이 최대값과 같을때 배열의 [i][0] 값을 Number 메소드를 활용하여 반환하면 배열의 요소가 어떤것이 갯수를 보았을때 과반수 이상인 숫자에 대하여 알 수 있다.

코드타카 메이트분이 거의 다 해놓으셨는데 let result ={};가 함수 밖으로 해놓아서 원하는 값에서 작동상 이상하지는 않지만 결함이 있긴 했었다. 정확한 방법을 위해서는 result의 초기값을 함수 안에 넣었더니 결함없이 문제를 해결할 수 있었다.

다른분들의 의견도 여기에 잘 레퍼런스로 넣어야겠다.

우리가 작성하여 완성된 코드는 아래와 같다.

⬇️ 내가 작성한 코드

function moreThanHalf(nums) {
  let result = {};
  nums.forEach((x) => {
    if (result[x]) {
      result[x] = result[x] + 1;
    } else {
      result[x] = 0 + 1;
    }
  });
  // console.log(result) // { '2': 1, '3': 2 }
  const resultValue = Object.values(result);
  // console.log(resultValue) // [ 1, 2 ]
  const resultMaxValue = Math.max(...resultValue);
  // console.log(resultMaxValue) // 2
  const resultarr = Object.entries(result);
  // console.log(resultarr) // [ [ 'a', 2 ], [ 'b', 1 ] ]

  for (i = 0; i < resultarr.length; i++) {
    if (resultarr[i][1] === resultMaxValue) {
      return Number(resultarr[i][0]);
    }
  }
}

const final = moreThanHalf([5,5,5,5,4,4,4,5,6,6,6])
console.log(final)

⬇️ 다른사람이 작성한 코드

profile
beckend developer

0개의 댓글