Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Leeyanggoo

[코딩테스트 입문] Day-3 사칙연산, 배열, 수학 본문

2023/코딩테스트

[코딩테스트 입문] Day-3 사칙연산, 배열, 수학

Leeyanggoo 2023. 5. 3. 20:37

나머지 구하기

정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.

// function solution(num1, num2) {
//     var answer = num1 % num2;
//     return answer;
// }

const solution = (num1, num2) => num1 % num2

 

중앙값 구하기

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

function solution(array) {
    for(let i=0; i<array.length; i++){
        for(let j=0; j<array.length-1; j++){
            if(array[j] >= array[j+1]){
                let temp = array[j]
                array[j] = array[j+1]
                array[j+1] = temp
            }
            
        }
    }
    var answer = array[(array.length-1)/2]
    return answer;
}

 

학원과 기능사 문제에서 자주 봤던 버블 정렬 알고리즘을 사용했다.

이 방법은 비효율적인만큼 간단하다.

 

버블 정렬(Bubble Sort)은 가장 간단하면서도 가장 비효율적인 정렬 알고리즘 중 하나입니다. 이름에서도 알 수 있듯이, 이 정렬 방식은 배열 안의 요소들이 버블처럼 서로 인접한 두 개의 요소를 비교하여 더 큰 값이 뒤로 가도록, 작은 값이 앞으로 가도록 계속 이동시키는 것을 반복하여 정렬하는 방식입니다.

자바스크립트로 구현한 버블 정렬의 기본적인 코드는 아래와 같습니다:

 

function bubbleSort(array) {
    let len = array.length;
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len - 1 - i; j++) {
            if (array[j] > array[j + 1]) {
                // Swap array[j] and array[j + 1]
                let temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
    return array;
}

 

위 코드에서 두 개의 for loop을 보게 되는데, 첫 번째 for loop은 배열 전체를 반복하는 반면, 두 번째 for loop는 배열의 각 요소를 첫 번째 요소부터 마지막에서 i번째 요소까지 반복하며 서로 인접한 두 요소를 비교합니다.

그런 다음, 만약 앞의 요소가 뒤의 요소보다 크다면 두 요소의 위치를 바꾸는 코드가 실행됩니다. 이 과정을 반복하면 배열의 가장 큰 값이 배열의 맨 끝으로 이동하게 되어, 마치 "버블이 올라가는" 것처럼 보이게 됩니다.

하지만 버블 정렬은 이중 for loop을 사용하므로 시간 복잡도가 O(n^2)이고, 이는 대용량 데이터에 대해 매우 비효율적이라는 단점이 있습니다. 따라서 실제 개발 환경에서는 퀵 정렬, 병합 정렬 등의 효율적인 알고리즘이 더 자주 사용됩니다.

 

Sort() 쓰면 편한데 왜 안 씀?ㅋㅋ

 

몰랐다.

 

말씀하신 sort는 대부분의 프로그래밍 언어에서 배열을 정렬하는 데 사용되는 내장 메소드입니다. JavaScript에서 Array.prototype.sort()는 배열의 요소를 적절한 위치에 정렬하며, 원래의 배열을 변경합니다.

기본 정렬 순서는 문자열의 유니코드 코드 포인트에 따라 결정됩니다. 예를 들어, 숫자 배열을 sort를 사용하여 정렬하면 이상한 결과를 얻을 수 있습니다.

 

let array = [10, 2, 1, 30, 4];
array.sort(); 
console.log(array); // [1, 10, 2, 30, 4]

 

sort 함수는 문자열 배열을 기대하기 때문에, 숫자 배열을 정렬할 때는 비교 함수를 제공해야 합니다.

 

let array = [10, 2, 1, 30, 4];
array.sort((a, b) => a - b); 
console.log(array); // [1, 2, 4, 10, 30]

 

JavaScript의 sort 함수는 비교 함수를 제공할 수 있는 유연성 때문에 편리하게 사용할 수 있습니다.

또한, sort 함수의 시간 복잡도는 엔진 구현에 따라 다릅니다. JavaScript의 대부분의 모던 엔진에서는 sort 메소드는 고급 정렬 알고리즘(Timsort 등)을 사용하므로 일반적으로 O(n log n)의 시간 복잡도를 가집니다.

그러나 무조건적으로 sort 함수가 다른 모든 정렬 알고리즘보다 뛰어나다고 할 수는 없습니다. 정렬이 필요한 데이터의 특성과 양, 그리고 특정 문제 상황에 따라 적절한 정렬 알고리즘을 선택하는 것이 중요합니다.

 

최빈값 구하기 (이게 레벨.. 0...?)

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

// function solution(array) {
//   let count = {};
  
//   for (let i = 0; i < array.length; i++) {
//     if (count[array[i]] === undefined) {
//       count[array[i]] = 1;
//     } else {
//       count[array[i]]++;
//     }
//   }
  
//   let modes = [];
//   let maxCount = 0;
  
//   for (let key in count) {
//     if (count[key] > maxCount) {
//       maxCount = count[key];
//     }
//   }
  
//   for (let key in count) {
//     if (count[key] === maxCount) {
//       modes.push(parseFloat(key));
//     }
//   }
  
//   if (modes.length > 1) {
//     return -1;
//   } else {
//     return modes[0];
//   }
// }

function solution(array){
    let frequency = {}; // array의 각 요소별 빈도를 저장하는 객체
    let max = 0; // 가장 많이 등장한 횟수
    let mode; // 최빈값
    
    array.forEach((number) => {
        frequency[number] = (frequency[number] || 0) +1; // 증가하거나 초기화
        
        if(frequency[number] > max){
            max = frequency[number]; // 최대 빈도수 업데이트
            mode = number; // 최빈값 업데이트
        }
    });
    
    // 최빈값 개수 확인
    let frequencyCheck = 0;
    for(let key in frequency){
        if(frequency[key] === max){
            frequencyCheck++;
        }
        if(frequencyCheck > 1){
            return -1;
        }
    }
    
    return mode;
}

 

나의 비천하고 남루한 머리론 못 풀어서 GPT 3.5와 GPT 4의 코드를 보며 이해하는 것으로 끝냈다...

간단히 설명한다면 이렇다.

 

1. 배열의 요소와 등장하는 빈도를 저장해야 한다. 이는 객체의 키와 값으로 저장한다.

2. 배열을 순회하면서 다른 요소가 나올 때 빈도수를 1로 초기화해야 한다.

3. 모든 과정을 거치며 최빈값을 업데이트한다.

4. 최빈값의 개수가 1개가 아닌 경우의 조건문이 필요하다.

 

더욱 간단히 설명하자면 나의 부족한 배움과 게으름 때문인 것이요...

 

짝수는 싫어요 (최빈값이 더 싫음ㄹㅇ)

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

function solution(n) {
    var answer = [];
    for(let i=1; i<=n; i++){
        if(i % 2 == 0){
            continue;
        } else {
            answer.push(i)
        }
    }
    return answer;
}