공부/코딩테스트

코딩테스트 8

뀨뿌뀨뿌 2023. 5. 29. 20:04

Q.  중복된 숫자 개수

정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return 하도록 solution 함수를 완성해보세요.

🚫제한 사항
1 ≤ array의 길이 ≤ 100
0 ≤ array의 원소 ≤ 1,000
0 ≤ n ≤ 1,000

❗입출력 예

array n result
[1, 1, 2, 3, 4, 5] 1 2
[0, 2, 3, 4] 1 0

😀 내가 푼 답

function solution(array, n) {
    return array.filter(num => num === n).length
}
  • filter()
    • filter()는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열을 리턴해줌
    • 주로 특정 조건을 만족하는 새로운 배열이 필요할 때 사용하는 편
    • 주어진 배열의 값들을 오름차순으로 접근해 콜백함수를 통해 true를 반환하는 요소를 기준으로 신규 배열을 반환함
    • filter() 사용시 주의사항
      • 객체를 직접 사용하거나 변형시키지는 않지만 콜백함수를 통해 수정할 수 있으며, 문제를 발생시키는 원인이 될수 있음
      • 콜백함수 호출 범위는 콜백함수가 처음이 되기 이전이며 filter는 순회하는 도중에 추가된 요소는 접근하지 않음
        => 반대로 순회하는 도중 수정이 일어나면 변경된 값이 콜백함수에 전달되고 삭제된 요소는 접근하지 않음

😊 문제풀이 답안 OR 다른사람들 답안

function solution(array, n) {
    var answer = 0;
    for(var i = 0; i < array.length; i++){
        if(array[i] == n){
            answer++
        }
    }
    return answer;
}

Q.  배열의 평균값

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

🚫제한 사항
0 ≤ numbers의 원소 ≤ 1,000
1 ≤ numbers의 길이 ≤ 100
정답의 소수 부분이 .0 또는 .5인 경우만 입력으로 주어집니다.

❗입출력 예

num result
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 5.5
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] 94.0

😀 내가 푼 답

function solution(numbers) {
  let sum = 0;
  for (let i = 0; i < numbers.length; i++) {
    sum += numbers[i];
  }
  return sum / numbers.length;
}

😊 문제풀이 답안 OR 다른사람들 답안

// reduce()
const solution = (numbers) => numbers.reduce((a, c) => a + c) / numbers.length

// forEach()
function solution(numbers) {
    let sum = 0
    numbers.forEach(num => sum += num)
    return (sum / numbers.length)
}
  • reduce()
    • 배열의 각 요소에 대해 주어진 함수를 실행하고, 하나의 결과값을 반환함
    • 화살표 함수로 간단하게 표현할 수 있음
    • array.reduce((accmulator, currentValue, currentIdx, array) => {
          return accmulator, + currentValue;
      }, initialValue);
      • accmulator: 값을 받아 누산하여 반환하는 기능, 초깃값을 지정했을 때 초깃값이 기본값이며, 초깃값이 없을 경우 배열의 첫번째 요소가 기본값이 됨
      • currentValue: 처리할 현재 요소를 말함, 초깃값이 지정된 경우 배열의 첫번째 요소가 currentValue가 되고, 초기값이 없는 경우 배열의 두번째 요소가 currentValue가 됨
      • currentIdx: 처리할 현재 요소의 인덱스, 선택사항
      • array: reduce()가 실행된 배열, 선택사항
      • initialValue: 초깃값을 지정할 수 있음
const arr = [1, 2, 3, 4];

const sum1 = arr.reduce((acc, cur) => acc + cur)
console.log(sum1);   // 10

const sum2 = arr.reduce((acc, cur) => acc + cur, 9)
console.log(sum2);     // 19
  • forEach()
    • 배열을 순회하는 여러 방법 중 하나
    • map() 메서드와 비슷하지만 따로 return하는 값이 없다는 차이점이 있음
    • forEach 메서드는 배열을 순회하기 위해 사용하지만, 기본적인 for문과 다른 방식으로 함수를 사용함
    • array.forEach((currentValue, idx, arr) => {])
      • forEach 메서드는 매개변수(parameter)와 함께 배열의 각 요소에 적용하게될 콜백함수를 전달함
      • 매개변수로 요소, idex, 호출한 배열을 받음
      • currentValue - 배열의 값
      • idx - 현재 항목의 인덱스, 생략 가능
      • arr - 현재 항목의 배열, 생략가능

Q.  짝수 홀수 개수

정수가 담긴 리스트 num_list가 주어질 때, num_list의 원소 중 짝수와 홀수의 개수를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

🚫제한 사항
1 ≤ num_list의 길이 ≤ 100
0 ≤ num_list의 원소 ≤ 1,000

❗입출력 예

num_list result
[1, 2, 3, 4, 5] [2, 3]
[1, 3, 5, 7] [0, 4]

😀 내가 푼 답

function solution(num_list) {
  return [
    num_list.filter((even) => even % 2 === 0).length,
    num_list.filter((odd) => odd % 2 !== 0).length,
  ];
}

😊 문제풀이 답안 OR 다른사람들 답안

// for
function solution(num_list) {
    var answer = [0,0];
    for(let a of num_list){
        answer[a%2] += 1
    }
    return answer;
}


// switch
function solution(num_list) {
    let arr = [0, 0];

    for (let i = 0; i < num_list.length; i++) {
        switch (num_list[i] % 2 === 0) {
            case true: arr[0] +=1; break;
            default: arr[1] +=1; break;
        };
        console.log(arr);
    };

    return arr;
};

// for
function solution(numbers) {
  let count = [0, 0];
  for (let i = 0; i < num_list.length; i++) {
    if (num_list[i] % 2 === 0) {
      count[0]++;
    } else count[1]++;
  }
  return count;
}

Q.  배열 자르기

정수 배열 numbers와 정수 num1num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

🚫제한 사항
2 ≤ numbers의 길이 ≤ 30
0 ≤ numbers의 원소 ≤ 1,000
0 ≤num1 < num2 < numbers의 길이

❗입출력 예

num_list num1 num2 result
[1, 2, 3, 4, 5] 1 3 [2, 3, 4]
[1, 3, 5] 1 2 [3, 5]

😀 내가 푼 답

function solution(numbers, num1, num2) {
  return numbers.slice(num1, num2 + 1);
}
  • slice()
    • slice는 새로운 배열로 반환됨
      => splice()와 다른 점!! splice()는 원본 배열을 변경함
    • array.slice(startIdx, endIdx)
    • 반환된 타입은 배열
    • start를 지정하지 않으면 0부터 시작되고, end는 종료할 인덱스 전까지 리턴하며 지정하지 않거나 배열의 길이보다 큰수가 오면 배열의 길이까지만 리턴함

😊 문제풀이 답안 OR 다른사람들 답안

// &&
function solution(numbers, num1, num2) {
    return numbers.filter((n, i) => num1 <= i && i <= num2);
}

// for
function solution(numbers, num1, num2) {
    //return numbers.splice(num1, num2);
    let res = [];
    for(;num1 <= num2; num1++) {
        res.push(numbers[num1]);
    }
    return res;
}

Q.  배열 원소의 길이

문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

🚫제한 사항
1 ≤ strlist 원소의 길이 ≤ 100
strlist는 알파벳 소문자, 대문자, 특수문자로 구성되어 있습니다.

❗입출력 예

strlist result
["We", "are", "the", "world!"] [2, 3, 3, 6]
["I", "Love", "Programmers."] [1, 4, 12]

😀 내가 푼 답

// map
function solution(strlist) {
    return strlist.map((x) => x.length)
}

// for
function solution(strlist) {
    let result = []
    for(let i = 0; i < strlist.length; i++){
        result.push(strlist[i].length)
    }
    return result
}

😊 문제풀이 답안 OR 다른사람들 답안

function solution(strlist) {
    var answer = [];
    strlist.forEach(el=>answer.push(el.length))
    return answer;
}

Q.  배열 뒤집기

정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.

🚫제한 사항
1 ≤ num_list의 길이 ≤ 1,000
0 ≤ num_list의 원소 ≤ 1,000

❗입출력 예

strlist result
[1, 2, 3, 4, 5] [5, 4, 3, 2, 1]
[1, 1, 1, 1, 1, 2] [2, 1, 1, 1, 1, 1, ]
[1, 0, 1, 1, 1, 3, 5] [5, 3, 1, 1, 1, 0, 1]

😀 내가 푼 답

function solution(num_list) {
  return num_list.reverse();
}
  • reverse()
    • 호출한 배열을 거꾸로 뒤집고, 그 배열을 가리키는 참조값을 리턴함
    • 원본 배열이 변형이 됨
    • [...arr].reverse() : 원본 배열을 복사해서 원본 배열은 유지하고, 새로운 배열을 리턴 하는 방법

😊 문제풀이 답안 OR 다른사람들 답안

//
function solution(num_list) {
  let arr = [];
  for (i = 1; i < num_list.length + 1; i++)
    arr.push(num_list[num_list.length - i]);
  return arr;
}

//
function solution(num_list) {
    var answer = [];
    var j = num_list.length
    for(var i = 1; i <= j; i++){
        answer.push(num_list[j-i])
    }
    return answer;
}

Q.  최댓값 만들기

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

🚫제한 사항
0 ≤ numbers의 원소 ≤ 10,000
2 ≤ numbers의 길이 ≤ 100

❗입출력 예

strlist result
[1, 2, 3, 4, 5] 20
[0, 31, 24, 10, 1, 9] 744

😀 내가 푼 답

function solution(numbers) {
    numbers.sort((x, y) => y - x)
    return numbers[0] * numbers[1]
}
  • sort()'
    • 배열을 정렬하기 위해서 사용하는 함수
    • arr.sort(function)
      • 정렬 순서를 정의하는 함수값이 생략되면 배열의 요소들은 문자열로 쥐급되어, 유니코드 값 순서대로 정렬됨
      • 두 개의 배열 요소를 입력받음
      • 매개변수로 a, b를 입력받은 경우,
        리턴하는 값이 0보다 작을 경우, a가 b보다 앞에 오도록 정렬하고
        리턴하는 값이 0보다 큰 경우, b가 a보다 앞에 오도록 정렬함
        0을 리턴하면 a와 b의 순서를 변경하지 않음

😊 문제풀이 답안 OR 다른사람들 답안

 function solution(numbers) {
    let sum = [];
    for (let i = 0; i < numbers.length - 1; i++) {
      sum.push(numbers[i] * numbers[i + 1])
    }
    return Math.max(...sum);
  }
  • Math.max()
    • 입력값으로 받은 숫자 중에서 가장 큰 숫자를 반환함
    • 매개변수로 입력받은 값들중에 하나라도 숫자로 변환하지 못한다면 NaN로 반환함
    • 매개변수를 제공하지 않으면 -Infinity를 반환함

'공부 > 코딩테스트' 카테고리의 다른 글

코딩테스트 10  (0) 2023.05.31
코딩테스트 9  (0) 2023.05.30
코딩테스트 7  (0) 2023.05.29
코딩테스트 6  (0) 2023.05.26
코딩테스트 5  (0) 2023.05.26