본문 바로가기
프로그래머스 코딩 테스트

프로그래머스 : JavaScript 알고리즘 100일 챌린지 45일차

by dongjin6539 2023. 6. 29.
728x90
반응형

프로그래머스 : JavaScript 알고리즘 100일 챌린지 45일차

 

코딩 기초 트레이닝 Day45

 

 

1. 배열의 길이를 2의 거듭제곱으로 만들 : 정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(arr) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
myString result
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6, 0, 0]
[58, 172, 746, 89] [58, 172, 746, 89]

 

답 확인하기
function solution(arr) {
    const pow2 = [0, 2, 4, 8, 16, 32, 64, 128, 256, 512]
    const arrLen = arr.length
    let idx
    for(let i = 0 ; i < pow2.length ; i ++) {
        if(arrLen < pow2[i]) break
        idx = pow2[i]
    }
    
    const zeroArr = Array(idx).fill(0)
    
    return [...arr, ...zeroArr.slice(0, idx-arrLen)]
}

 

해설 확인하기

코드는 주어진 배열 arr의 길이를 2의 거듭제곱으로 확장하는 함수 solution입니다.

해당 함수는 다음과 같은 방식으로 동작합니다.

pow2라는 배열에 0부터 512까지의 2의 거듭제곱 값을 저장합니다.

arrLen 변수에 arr 배열의 길이를 저장합니다. idx 변수를 초기화합니다.

반복문을 통해 pow2 배열을 순회합니다. 각 반복에서 다음을 수행합니다.

만약 arrLen이 현재의 2의 거듭제곱 값보다 작다면, 반복문을 종료합니다.

그렇지 않으면, idx 변수에 현재의 2의 거듭제곱 값을 저장합니다.

zeroArr라는 배열을 생성합니다. 이 배열은 0으로 초기화되며, 길이는 idx 값입니다.

arr 배열과 zeroArr 배열의 일부를 결합하여 새로운 배열을 생성합니다. 결합하는 방식은 다음과 같습니다.

arr 배열의 요소들을 먼저 새로운 배열에 추가합니다.

그 다음, zeroArr 배열에서 idx - arrLen 개수만큼의 요소를 잘라내어 새로운 배열에 추가합니다.

생성된 새로운 배열을 반환합니다.

즉, solution 함수는 주어진 배열 arr을 기존 길이에서 가장 가까운 2의 거듭제곱으로 확장하여 반환하는 함수입니다. 반환된 배열은 arr 배열의 요소들을 유지하면서, 나머지 부분은 0으로 채워집니다.

 

2. 배열 비교하기 : 이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.

  • 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
  • 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.

두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.

function solution(arr1, arr2) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
arr1 arr2 result
[49, 13] [70, 11, 2] -1
[100, 17, 84, 1] [55, 12, 65, 36] 1
[1, 2, 3, 4, 5] [3, 3, 3, 3, 3] 0

 

답 확인하기
function solution(arr1, arr2) {
  let sum1 = 0; // arr1의 원소들의 합을 저장할 변수
  let sum2 = 0; // arr2의 원소들의 합을 저장할 변수

  // arr1의 원소들의 합 계산
  for (let num of arr1) {
    sum1 += num;
  }

  // arr2의 원소들의 합 계산
  for (let num of arr2) {
    sum2 += num;
  }

  // 대소관계 비교
  if (arr1.length > arr2.length || (arr1.length === arr2.length && sum1 > sum2)) {
    return 1;
  } else if (arr1.length < arr2.length || (arr1.length === arr2.length && sum1 < sum2)) {
    return -1;
  } else {
    return 0;
  }
}

 

해설 확인하기

코드는 주어진 두 개의 배열 arr1과 arr2를 비교하여 대소관계를 판단하는 함수 solution입니다. 다음과 같은 방식으로 동작합니다:

sum1과 sum2라는 변수를 초기화합니다. 이 변수들은 arr1과 arr2의 원소들의 합을 저장하기 위해 사용됩니다.

반복문을 통해 arr1의 원소들의 합을 계산합니다. 각 원소를 num이라는 변수에 순차적으로 할당하고, sum1에 num을 더해줍니다.

반복문을 통해 arr2의 원소들의 합을 계산합니다. 각 원소를 num이라는 변수에 순차적으로 할당하고, sum2에 num을 더해줍니다.

대소관계를 비교하여 결과를 반환합니다.

만약 arr1의 길이가 arr2의 길이보다 크거나, 길이가 같으면서 arr1의 합이 arr2의 합보다 큰 경우, 1을 반환합니다.

만약 arr1의 길이가 arr2의 길이보다 작거나, 길이가 같으면서 arr1의 합이 arr2의 합보다 작은 경우, -1을 반환합니다.

그 외의 경우에는 0을 반환합니다.

즉, solution 함수는 arr1과 arr2의 길이와 원소들의 합을 비교하여 대소관계를 판단하고, 그에 따라 1, -1, 또는 0을 반환합니다.

 

3. 문자열 묶기 : 문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

function solution(strArr) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
strArr result
["a", "bc", "d", "efg", "hi"] 2

 

답 확인하기
function solution(strArr) {
    const dict={}
    // key: 문자열 길이, value: 문자열 목록
    strArr.forEach(item => {
        const len = item.length
        dict[len] = dict[len] ?? []
        dict[len].push(item)
    })
    // 길이 별 목록 수의 최댓값
    const values = Object.values(dict).map(a => a.length)
    return Math.max(...values)
}

 

해설 확인하기

코드는 주어진 문자열 배열 strArr에서 문자열의 길이별로 목록을 만들고, 각 길이별 목록의 최댓값을 반환하는 함수 solution입니다.

해당 함수는 다음과 같은 방식으로 동작합니다:

dict라는 빈 객체를 생성합니다. 이 객체는 문자열의 길이를 키(key)로 가지고, 해당 길이의 문자열 목록을 값(value)으로 가집니다.

strArr 배열을 순회하면서 각 문자열에 대해 다음을 수행합니다:

item이라는 변수에 현재 문자열을 할당합니다.

문자열의 길이를 len이라는 변수에 저장합니다.

dict 객체에서 len을 키로 가지는 값이 존재하지 않으면 빈 배열을 할당합니다. (dict[len] = dict[len] ?? [])

dict[len] 배열에 현재 문자열 item을 추가합니다.

dict 객체의 값들(각 길이별 문자열 목록)을 가져와서 배열로 변환합니다. (Object.values(dict))

이 배열은 각 길이별 목록을 담고 있습니다.

각 길이별 목록의 길이를 구합니다. (map(a => a.length))

이를 통해 각 길이별로 몇 개의 문자열이 있는지를 나타내는 배열이 생성됩니다.

Math.max(...values)를 통해 배열 values의 최댓값을 반환합니다.

이 값은 문자열 길이별 목록 수 중 가장 큰 값입니다.

즉, solution 함수는 주어진 문자열 배열에서 문자열의 길이별로 목록을 만들고, 각 길이별 목록의 최댓값을 반환합니다. 이를 통해 가장 많은 문자열을 가진 길이를 찾을 수 있습니다.

 

4. 배열의 길에 따라 다른 연산하기  : 정수 배열 arr과 정수 n이 매개변수로 주어집니다. arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(arr, n) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
arr n result
[49, 12, 100, 276, 33] 27 [76, 12, 127, 276, 60]
[444, 555, 666, 777] 100 [444, 655, 666, 877]

 

답 확인하기
function solution(arr, n) {
    if(arr.length % 2 === 0) {
        return arr.map((a, i) => i%2 !== 0 ? a+n : a)
    } else {
        return arr.map((a, i) => i%2 === 0 ? a+n : a)
    }
}

 

해설 확인하기

코드는 주어진 배열 arr에서 홀수 인덱스 또는 짝수 인덱스에 있는 요소들에 대해 n을 더한 새로운 배열을 반환하는 함수 solution입니다.

해당 함수는 다음과 같은 방식으로 동작합니다:

주어진 배열 arr의 길이가 짝수인지 확인합니다. (arr.length % 2 === 0)

만약 길이가 짝수라면, 짝수 인덱스에 있는 요소들에 대해서만 n을 더한 새로운 배열을 생성하여 반환합니다.

새로운 배열을 생성하기 위해 arr.map() 메서드를 사용합니다. 각 요소와 인덱스를 매개변수로 받는 콜백 함수를 사용합니다.

인덱스가 홀수인 경우에는 해당 요소에 n을 더한 값을 반환하고, 짝수 인덱스인 경우에는 원래의 요소 값을 반환합니다.

길이가 홀수인 경우에는 홀수 인덱스에 있는 요소들에 대해서만 n을 더한 새로운 배열을 생성하여 반환합니다.

방법은 위와 동일합니다. arr.map() 메서드와 콜백 함수를 사용하여 처리합니다.

인덱스가 짝수인 경우에는 해당 요소에 n을 더한 값을 반환하고, 홀수 인덱스인 경우에는 원래의 요소 값을 반환합니다.

즉, solution 함수는 주어진 배열 arr에서 짝수 인덱스 또는 홀수 인덱스에 위치한 요소들에 대해 n을 더한 새로운 배열을 반환합니다.

 

5. 뒤에서 5등까지 : 정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    var answer = [];
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
num_list result
[12, 4, 15, 46, 38, 1, 14] [1, 4, 12, 14, 15]

 

답 확인하기
function solution(num_list) {
  let answer = new Array(5);
  num_list.sort((a, b) => a - b);
  for (let i = 0; i < 5; i++) {
    answer[i] = num_list[i];
  }
  return answer;
}

 

해설 확인하기

코드는 num_list 배열을 정렬한 후, 가장 작은 5개의 원소를 포함하는 배열을 반환하는 함수 solution입니다.

해당 함수는 다음과 같은 방식으로 동작합니다:

크기가 5인 answer 배열을 생성합니다. 이 배열은 정렬된 원소를 담을 것입니다.

num_list 배열을 오름차순으로 정렬합니다. 정렬은 sort() 메서드를 사용하며, 비교 함수 (a, b) => a - b를 통해 원소를 비교하여 정렬합니다. 비교 함수는 두 원소 a와 b를 받아 a - b를 반환하는데, 이를 통해 작은 순서로 정렬됩니다.

반복문을 통해 정렬된 num_list 배열의 첫 5개 원소를 answer 배열에 복사합니다. 각 반복에서 인덱스 i를 사용하여 num_list[i] 값을 answer[i]에 할당합니다.

최종적으로 answer 배열을 반환합니다.

즉, solution 함수는 주어진 num_list 배열을 정렬하여 가장 작은 5개의 원소를 포함하는 새로운 배열을 반환합니다.

728x90
반응형