Code Kata | Review(3)

이진웅·2021년 12월 7일
0

알고리즘

목록 보기
3/14
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개 이상입니다.

나의 접근법

처음 문제를 확인했을땐 쉽다고 생각했지만, 문제를 곱씹어보니 쉬운 문제가 아니었다 😢
일단 코드라도 쳐보자 생각해 반복문을 돌려보았다

function moreThanHalf(nums) {
  let compareArr = []
  let winArr = []

  for (i = 0; i < nums.length - 1; i++) {
    for (j = i + 1; j < nums.length; j++) {
      if (nums[i] === nums[j]) { // i와 j가 같으면 비교하기위한 배열로 push해서
        compareArr.push(nums[i])
        if (compareArr.length > winArr.length) { // winArr을 기준으로 삼아 
          winArr = compareArr                    // 큰 값을 계속 덮어쓰려했다
        }
      }
    }
  }
  return winArr
}

아무리 생각해봐도 내가 한게 그냥 nums값을 input한거랑 별 다른게 없어보였다,
오히려 nums의 값이 온전히 반환되지도 않았을 것이다.

이번 문제도 결국 내 힘으론 풀어내지 못했다.

풀이

function moreThanHalf(nums) {
  let obj = {},     // 객체 obj에서 key는 nums에 있는 해당 숫자를 뜻하며,
      majority = 0, // value는 해당 숫자가 총 몇 개 있는지를 의미한다
      ans = 0;
  
  for (let i = 0; i < nums.length; i++) { // 정렬된 nums를 순차 접근하여 해당 숫자가 
                                          // 총 몇 개 있는지 객체에 담기
    if (obj[nums[i]] === undefined) {     
      obj[nums[i]] = 1; // 만약 객체에 처음 담긴다면, 해당 key의 value를 1로 설정
    } else {
      obj[nums[i]]++; // 만약 객체에 처음 담기는게 아니라면, 해당 key의 value를 1 증가시키기
    }
  }
	
  for (let key in obj) {       // 객체에 순차 접근하여 nums 배열에서 가장 많이 들어간 숫자
    if (obj[key] > majority) { // (객체에서 가장 높은 value값을 가지는 숫자)를 반환
      majority = obj[key];
      ans = Number(key); // string으로 된 key값을 정수로 변환
    }
  }
  return ans;
}

배열을 객체로 재정의해서 푸는 방법이다

또 다른 풀이

function moreThanHalf(nums) {
  for (let i = 0; i < nums.length; i++) { 
    if (nums.filter((item) => item === nums[i]).length > nums.length / 2) {
      return nums[i]; // 변수로 들어온 배열값에서 nums[i]와 같은 값의 길이가 
                      // 변수로 들어온 값의 총 길이의 반보다 크다면 그 값을 반환한다
    }                 // 총 길이의 절반보다 커야 과반수가 될 수 있기 때문에! 
  }
}

소감

이번 문제는 풀면서 현자타임이 많이 왔었다.
바로 윗 풀이처럼 정말 간단하게 풀 수도 있었는데, 진짜 코드카타할 때 마다 벽 느끼는 중이다.
열심히 공부해야지...🤯

0개의 댓글