[Lv1] 배열 관련 문제 풀이 및 정리

이말감·2022년 8월 16일
0

Programmers

목록 보기
29/32

프로그래머스 Lv1 배열 관련 문제 - javascript


나누어 떨어지는 숫자 배열

문제

링크

풀이

function solution(arr, divisor) {
    arr = arr.filter((num) => !(num % divisor));
    return arr.length ? arr.sort((a, b) => a - b) : [-1];
}

arr 배열에 담겨있는 숫자들 중, divisor로 나누어지는 값을 오름차순으로 정렬한 배열을 출력하는 문제다.

  1. filter를 이용해서 num % divisor이 0인 값만 걸러낸다.
  2. 베열이 비었을 경우, -1을 출력하고 그렇지 않다면 오름차순으로 정렬한 배열을 출력한다.

두 개 뽑아서 더하기

문제

링크

풀이

function solution(numbers) {
    const answer = [];
    for (let i = 0; i < numbers.length; i++) {
        for (let j = i+1; j < numbers.length; j++) {
            answer.push(numbers[i] + numbers[j]);
        }
    }
    numbers = [...new Set(answer)].sort((a, b) => a - b);
    return numbers;
}

다른 인덱스에 있는 두 개의 수를 더해서 만들 수 있는 모든 수를 오름차순으로 정렬한 배열을 출력하는 문제이다.

  1. 이중 for문을 이용해서 다른 인덱스에 있는 두 개의 수를 더한 후, answer 배열에 넣는다.
    1-1. 이때 안쪽 for문에서 j = i + 1인 이유는 어차피 다른 인덱스에 있는 수를 더해야 하고, i 이전 수는 전에 이미 더했었기 때문에 굳이 해주지 않아도 되기 때문이다.
  2. answer 배열을 set으로 묶어 중복을 제거하고, sort로 정렬한 후 출력한다.

같은 숫자는 싫어

문제

링크

풀이

function solution(arr)
{
    let answer = [];
    for (let a of arr) {
        if (a !== answer.slice(-1)[0]) answer.push(a);
    }
    return answer;
}

배열 arr에서 연속적으로 나타나는 숫자를 제거하고 남은 수를 출력하는 문제이다.
처음에는 위와 같이 answer라는 배열을 만들고, 그 안에 값들을 하나씩 넣고 answer의 마지막 원소와 비교하여 push 하는 방법으로 문제를 풀었다.
이 방법도 맞지만 다른 분들의 풀이를 참고하여 다른 방법으로도 풀어보았다.

function solution(arr)
{
    return arr.filter((item, idx) => item !== arr[idx+1]);
}

이 풀이는 위에서 answer라는 배열을 따로 만들고 이 배열의 마지막 원소와 현재 원소를 비교하여 문제를 풀었던 방식과 반대이다.
현재 원소값과 그 다음 원소값이 다를 경우에만 배열에 넣어주면 된다.

  1. filter로 배열 내 원소를 조건에 따라 걸러준다.
  2. 현재 원소가 item이고 인덱스가 idx일 때, item과 다음 원소, 즉 인덱스가 idx+1인 원소를 비교하여 다를 경우에만 배열에 넣어준다.

문자열 내림차순으로 배치하기

문제

링크

풀이

function solution(s) {
    return s.split('').sort().reverse().join('');
}

주어지는 문자열 s를 내림차순으로 정렬하는 문제이다.
대문자는 소문자보다 아스키코드가 작기 때문에, 내림차순으로 정렬하면 알아서 맨 뒤로 정렬된다.

  1. s를 배열로 바꾼다.
  2. sort()로 정렬한다.
  3. join으로 배열을 합치고 출력한다.

여기서 1. s를 배열로 바꾼다.를 나는 s.split('')으로 풀었지만,
[...s]처럼 자바스크립트의 스프레드 연산자를 이용해서 쉽게 바꿀 수 있다.


없는 숫자 더하기

문제

링크

풀이

function solution(numbers) {
    let answer = 0;
    for (let n = 0; n < 10; n++) {
        if (!numbers.includes(n)) {
            answer += n;
        }
    }
    return answer;
}

numbers 배열에 0부터 9까지 숫자 중 없는 숫자를 찾아 더한 수를 출력하는 문제다.

  1. 범위가 0~9이므로 for문의 범위를 0 <= n < 10으로 설정했다.
  2. n이 numbers에 없을 때 answer에 더해준다.
  3. 반복문이 끝나면 answer를 출력한다.

다른 분들의 코드를 참고하던 중, 정말정말 신박한 풀이를 발견했다.

function solution(numbers) {
    return 45 - numbers.reduce((acc, cur) => acc + cur, 0);
}

0부터 9까지의 합이 45이므로 reduce를 이용하여 numbers 배열의 합을 구하고 빼면 없는 수의 합을 구할 수 있다.
너무 간단하고 신박한 풀이다. 짱..
하지만 이 방법은 지금 문제에서 주어진 것처럼 0부터 9라는 숫자의 범위가 주어지고, numbers의 모든 원소가 서로 다르다는 조건이 있기 때문에 성립될 수 있다.


제일 작은 수 제거하기

문제

링크

풀이

function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)), 1);
    return arr.length ? arr : [-1];
}

배열 arr에서 가장 작은 수를 제거한 배열을 출력하는 문제이다.

  1. 배열 arr에서 가장 작은 수를 제거한다.
    1-1. Math.min을 이용해서 배열에서 가장 작은 수를 찾는다.
    1-1-1. 배열의 경우, Math.min을 사용하려면 스프레드 연산자를 사용해야 한다. Math.min(...arr)
    1-2. indexOf를 이용하여 배열 내 특정 수의 인덱스를 구한다.
    1-3. splice를 이용하여 특정 원소를 삭제한다.
    1-3-1. splice(인덱스, 삭제할 원소의 개수)
  2. arr 배열에 원소가 없을 경우 [-1]을 출력하고, 있을 경우 arr를 출력한다.

정수 내림차순으로 배치하기

문제

링크

풀이

function solution(n) {
    return +([...(n + '')].sort((a, b) => b - a).join(''));   
}

n이라는 정수의 각 자릿수를 내림차순으로 정렬한 정수를 리턴하는 문제다.

  1. n이 정수이므로 n + ''을 이용해 문자열로 바꿔준다.
  2. 스프레드 연산자를 이용해 배열로 바꾼다.
  3. sort((a, b) => b - a)으로 내림차순으로 정렬한다.
  4. 정렬된 배열을 join으로 합쳐주고 출력한다.
profile
전 척척학사지만 말하는 감자에요

0개의 댓글