daily 알고리즘 : 프로그래머스 0 level 2일차

소히·2022년 10월 25일
0

알고리즘Daily

목록 보기
6/22
post-thumbnail

Reduce 사용을 생활화하쟈..!

중앙값 구하기


문제

중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • array의 길이는 홀수입니다.
  • 0 < array의 길이 < 100
  • -1,000 < array의 원소 < 1,000

풀이

sort 메서드를 이용하여 오름차순 정렬을 한 후, arr의 length의 반절값을 사용하여 배열의 중간값을 구한다. 이 때, arr의 길이는 홀수이므로 Math.floor 로 소수점내림을 해주었다.


function solution(arr) {
  return arr.sort((a, b) => a - b)[Math.floor(arr.length / 2)];
}

최빈값 구하기


문제

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.


제한사항

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

입출력 예

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

  • [1]에는 1만 있으므로 최빈값은 1입니다.

풀이

[1, 2, 3, 3, 3, 4] 라는 배열에서 최빈값을 찾는다고 생각해봤을때,

먼저 새로운 객체(stockObj)를 생성하여 각 key값의 value에 빈도수를 나타내었다.
ex) {1: 1, 2: 1, 3: 3, 4: 1}
그리고 resArr 라는 stockObj의 value값을 담은 배열을 생성하였다.
ex) [1,1,3,1]

그 후 최빈값이 두 개 이상일 때, 한 개 일때의 경우로 나누어 생각하였다.

최빈값이 두 개 이상이면 -1을 리턴해야 했으므로 resArrf를 sort정렬 하여 value를 오름차순으로 정렬하였다. 그래서 배열의 마지막요소와 마지막-1 요소가 같으면 -1을 리턴하도록 하였다.

최빈값이 한 개 이면 maxValue값(3)을 구한 후 미리 생성한 객체의 key,value 값과 비교하여 객체의 key값을 리턴해주었다.


function solution(arr) {
  let stockObj = {};

  for (let i in arr) {
    if (!stockObj[arr[i]]) stockObj[arr[i]] = 0;
    stockObj[arr[i]]++;
  }


  let resArr = Object.values(stockObj);
  let maxValue = Math.max.apply(null, resArr);

  resArr.sort((a, b) => a - b);

  // 최빈값이 두 개 이상일 때
  if (resArr[resArr.length - 2] === resArr[resArr.length - 1]) {
    return -1;
  }

  // 최빈값이 한 개일 때
  for (let j in stockObj) {
    if (Number(stockObj[j]) === Number(maxValue)) return Number(j);
  }
}

✏️ 다른사람들의 풀이를 보았는데 처음 stockObj 객체를 생성할 때 for of 구문과 논리합연산자를 사용한 것과 reduce를 사용한 걸 보고 한번 더 놀랐다...reduce랑 어서 친해져야 할텐데...!
그리고 최빈값의 갯수에 따라 분기 할 때 삼항연산자로 로직을 변경 할 수 있었는데 그렇게 되면 코드도 무척 간단해지고 가독성이 높아지는 것 같다.

하기는 다른 분의 코드인데 긁어와보았다...

function solution(array) {
    const freq = {};

    for (const n of array) {
        freq[n] = (freq[n] || 0) + 1;
    }

    const keys = Object.keys(freq);

    keys.sort((a,b) => freq[b] - freq[a]);

    const max = keys[0];

    return freq[keys[0]] === freq[keys[1]] ? -1 : +max;
}

짝수는 싫어요


문제

정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 100

풀이

짝수를 배제해야하므로 i의 초기값을 1로 주었다.
i가 n이하일 때 까지만 i에 +2를 하면서 answer 배열에 push 해주었다.

function solution(n) {
  let i = 1;
  let answer = [];
  while (i <= n) {
    answer.push(i);
    i = i + 2;
  }
  return answer;
}

0개의 댓글