IdoCleanCode
article thumbnail
반응형

코딩 테스트 - 프로그래머스

 

코딩 테스트 - 프로그래머스

코딩 입문 테스트 두 수의 합 두 수의 차 두 수의 곱 몫 구하기 두 수의 나눗셈 숫자 비교하기 분수의 덧셈 나머지구하기 배열 두배 만들기 출처 https://programmers.co.kr/

idocleancode.tistory.com

최빈값 구하기
최빈값 구하기

문제

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

문제 원리

숫자들의 배열에서 자주 등장하는 값을 찾는 것입니다. 이를 최빈값(mode)이라고 합니다. 최빈값 원리는 다음 단계별로 진행 됩니다.

 

  1. 변수 생성 초기화(맵 생성)
    먼저, 각 숫자가 배열에서 몇번 등장하는지 세어야합니다. 이를 위하 각 숫자를 키로, 그 숫자의 등장 횟수를 값으로 가진 맵 구조를 생성합니다.

  2. 최빈값 찾기
    배열을 순회하면서 가장 높은 등장 횟수를 가진 숫자를 찾습니다. 

  3. 최빈값 후보 업데이트 
    배열을 순회하던 중 현재 숫자의 등장 횟수가 이전에 찾은 가장 높은 등장 횟수 보다 높다면, 업데이트하고, 해당 숫자만을 원소로 새로운 배열을 생성합니다.

  4. 최빈값 후보 추가
    만약 현재 숫자의 등장 횟수가 가장 높은 등장 횟수와 같으면, 해당 숫자를 최빈값 후보 배열에 추가합니다.

  5. 최종 결과 도출
    모든 숫자를 확인후, 최빈 값 후보 배열의 길이를 확인합니다. 만약 후보가 하나뿐이라면, 그 값이 최빈값이 되고, 두개이상이면 -1을 반환합니다.

 

문제 풀이

Python

원리대로 풀이

def solution(array):
    # 변수 생성
    count_map = {}
    count_max = 0
    mode = []

    # 배열 순회
    for i in range(len(array)):
        num = array[i]
        if num not in count_map:
            count_map[num] = 1
        else:
            count_map[num] += 1
        if count_map[num] > count_max:
            count_max = count_map[num]
            mode = [num]
        elif count_map[num] == count_max:
            mode.append(num)
    # 결과 추출
    if len(mode) == 1:
        return mode[0]
    else:
        return -1

 

효율적인 코드

from collections import Counter

def solution(array):
    freqs = Counter(array)
    max_freq = max(freqs.values())
    modes = [k for k, v in freqs.items() if v == max_freq]

    return modes[0] if len(modes) == 1 else -1

 

JavaScript

원리대로 풀이

function solution(array){
    let count_map = {};
    let max_count = 0;
    let mode = [];

    for(let i = 0; i < array.length; i++) {
        num = array[i];
        if (count_map[num] === undefined) {
            count_map[num] = 1;
        } else {
            count_map[num] += 1;
        }
        if (count_map[num] > max_count) {
            max_count = count_map[num];
            mode = [num]
        }else if (count_map[num] === max_count){
            mode.push(num)
        }

    }

    if (mode.length === 1){
        return mode[0]
    }else {
        return -1
    }
}

 

효율적인 코드

from collections import Counter

def solution(array):
    freqs = Counter(array)
    max_freq = max(freqs.values())
    modes = [k for k, v in freqs.items() if v == max_freq]

    return modes[0] if len(modes) == 1 else -1
    • reduce 함수의 기본 구조
      배열.reduce(callback[, initialValue])​
      callback
      각요소에 대해 실행할 함수로, 네 개의 인자를 받습니다. accumualtor(누산기), current value(현재 값), current index(현재 인덱스), source array(원본 배열)

      initialValue(optional)
      누산기의 초기값입니다. 제공하지 않을 경우, 배열의 첫 번째 요소가 초기값으로 사용됩니다.
      // 배열의 모든 숫자 곱하기
      const numbers = [1, 2, 3, 4, 5];
      const product = numbers.reduce((accumulator, currentValue) => accumulator * currentValue);
      console.log(product); // 120
      이 예제에서는 reduce 함수를 사용하여 배열의 모든 숫자를 곱합니다. 
      초기값을 제공하지 않았기 때문에 배열의 첫 번째 요소가 초기 누산기 값으로 사용되었습니다.
      
      // 객체 배열에서 특정 속성의 값 합산하기
      const items = [
        { name: 'item1', price: 100 },
        { name: 'item2', price: 200 },
        { name: 'item3', price: 300 }
      ];
      const total = items.reduce((accumulator, item) => accumulator + item.price, 0);
      console.log(total); // 600
      이 예제에서는 reduce 함수를 사용하여 객체 배열에서 각 객체의 price 속성 값을 합산합니다.
      
      // 배열 내 각 요소의 발생 횟수 세기
      const fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
      const count = fruits.reduce((tally, fruit) => {
        tally[fruit] = (tally[fruit] || 0) + 1;
        return tally;
      }, {});
      console.log(count); // { apple: 3, banana: 2, orange: 1 }
      이 예제에서는 reduce 함수를 사용하여 배열 내 각 요소의 발생 횟수를 객체로 만듭니다.
      이때 누산기는 빈 객체로 초기화되며,각 과일 이름을 키로, 해당 과일의 출현 횟수를 값으로 가집니다.​​


    • Object.entries
      Object.entries(obj)​
      주어진 객체의 자체 열거 가능한 속성 [key, value] 쌍의 배열을 반환하는 내장함수 입니다. 반환되는 배열은 원본 객체의 속성 순서를 따릅니다. for in  루프에서 제공하는 순서 동일하며, 문자열키를 오름차순으로 정한 후, 심볼키 를 삽입 순서대로 정렬합니다.

      const obj = {
          a: 'Hello',
          b: 'World',
          c: 2023,
          1:'숫자일'
      };
      
      console.log(Object.entries(obj));
      // Output: [['1', '숫자 ']['a', 'Hello'], ['b', 'World'], ['c', 2023]]

출처

https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

반응형
profile

IdoCleanCode

@IdoCleanCode

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!