코드카타 #1

소진수·2021년 7월 27일
1

algorithm

목록 보기
1/9
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개 이상


사고과정


  • 배열의 인자(숫자)중에서 절반이 넘으면 = nums.length/2 <
  • 배열안의 숫자들을 하나씩 골라서 서로 비교하면서 같은 값을 찾는다= 이중 for 문
  • 만약에 배열의 숫자가 서로 같을 경우? 근데 과반수가 넘는 숫자를 어떻게 찾지?
  • 2중 반복문으로 각 숫자를 돌고 num[i] === num[j]가 같다면 그럴경우
  • 조건이 충족한 값을 변수 sum에다가 더한다..
  • 그리고 해당 sum 변수가 nums.length/2 보다 클경우
  • sum을 반환하는게 아니다. sum에 더해진 값을 반환 => 그 숫자를 반환한다 [i]

1차 답안


function moreThanHalf(nums) {
  let answer = 0;
  for (let i = 0; i < nums.length; i++) {
    let sum = [];
    for (let j = 0; i < nums.length; i++) {
      if(nums[i] === nums[j]) {
        sum.push(nums[i]);
      }
    }
    if (sum.length >= nums.length/2) {
      answer = nums[i];
    } 
  }
  return answer;
}

리플릿 테스트 결과 : undefined 혹은 0

수정 1

  • 보니까 어차피 nums[i]를 반환하는 거니까 answer는 불필요하다
    • answer 없앰

수정 2

  • sum 변수도 push할 필요 없이 해당 값이 오면 갯수가 늘어나면 된다
    • 그래서 push 말고 정수로 하고 증가연산자 사용

2차 답안


  function moreThanHalf(nums) {
    for (let i = 0; i < nums.length; i++) {
      let sum = 0;
      for (let j = 0; i < nums.length; i++) {
        if(nums[i] === nums[j]) {
          sum += 1;
        }
      }
      if (sum >= nums.length/2) {
        return nums[i]
      } 
    }
  }

리플릿 테스트 2차 결과 : 여전히 undefined 혹은 0

  • undefined 혹은 0이 나온다는 것은 조건문이 정상적으로 작동하지 않는다는 얘기

    무엇이 문제일까...
    이럴수가... 문제는 오탈자였다
    이중 for문에서 j반복문에 i를 적어놨다. ;;
    그렇다면 위에 방식도 똑같이 작동할까?


최종 답안


  function moreThanHalf(nums) {
  for (let i = 0; i < nums.length; i++) {
    let sum = 0;
    for (let j = 0; j < nums.length; j++) {
      if(nums[i] === nums[j]) {
        sum += 1;
      }
    }
    if (sum >= nums.length/2) {
      return nums[i];
    } 
  }
}

리플릿 테스트 3차 결과 : test passed

profile
느려서 바쁘다

0개의 댓글