[TIL] 240428 (Array.slice())

·2024년 4월 28일

TIL

목록 보기
25/268

🥞 오늘 한 일

  • 알고리즘 코드카타
    • 서울에서 김서방 찾기
    • 나누어 떨어지는 숫자 배열
    • 핸드폰 번호 가리기
    • 없는 숫자 더하기
    • 제일 작은 수 제거하기

🍽️ 문제 해결

알고리즘 코드카타

서울에서 김서방 찾기

문제

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

내 풀이

function solution(seoul) {
    return `김서방은 ${seoul.indexOf("Kim")}에 있다`
}

처음에는 배열이라 find 메서드를 사용할까 했으나, 생각해보니 indexOf() 메서드를 쓰면 쉽게 해결될 것 같아 한 줄로 해결했다!

나누어 떨어지는 숫자 배열

문제

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

내 풀이

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

filter 메서드를 사용해서 간단하게 풀어보았다.

핸드폰 번호 가리기

문제

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

내 풀이

function solution(phone_number) {
    let result = '';
    for (let i=0; i<phone_number.length; i++){
        if (phone_number.length - i > 4){
            result += '*';
        } else {
            result += phone_number[i];
        }
    }
    return result;
}

분명 더 좋은 방법이 있을거라고 생각했지만, 생각나는 방법이 그저 반복문밖에 없어서 반복문을 사용했다 ㅠ
풀고난 후 다른 사람들의 풀이를 보니 역시 더 간단하고 좋은 방법들이 있었다.

다른 사람의 풀이

function hide_numbers(s){
  	var result = "*".repeat(s.length - 4) + s.slice(-4);
    return result;
}

slice 메서드만 기억을 했다면 이런 방식으로 풀 수 있었을 것 같아서, 이 기회를 통해 제대로 기억해두어야겠다.

없는 숫자 더하기

문제

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

내 풀이

function solution(numbers) {
    let result = 0;
    for (let i=0; i<10; i++){
        if(numbers.indexOf(i) === -1){
            result += i;
        }
    }
    return result;
}

반복문과 indexOf() 메서드를 사용해, 찾지 못할 경우 -1을 리턴하는 것을 이용해 문제를 간단히 풀었다.
다른 사람의 풀이 중 신박한 것이 있어서 한 번 가져와봤다.

다른 사람의 풀이

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

0~9의 총합에서, 배열 내 요소들을 다 더한 값을 빼주는 방법이었다. 상상도 못한 방법이었다.

제일 작은 수 제거하기

문제

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

내 풀이

function solution(arr) {
    let result = arr.filter((item)=>item!==[...arr].sort().shift());
    if (result.length===0) return [-1];
    return result;
}

sort() 메서드로 작은 수부터 정렬된 배열의 첫번째 값만 빼고 필터를 적용시켰다. 우선 코드 실행 시 정답이라 제출에 문제가 없을 줄 알았는데, 수많은 실패가 떴다... 시간 초과라 생각해 다른 방법을 생각해봤다.

function solution(arr) {
    let result = arr.filter((item)=>item!==[...arr].sort((a,b)=>b-a).pop());
    if (result.length===0) return [-1];
    return result;
}

shift() 메서드는 배열의 맨 앞에 있는 값을 변경하는 것이기 때문에, 다른 배열 값들을 전부 옮겨줘야해서 번거로운 단점이 있다. 그래서 sort 정렬을 반대로 한 후 pop() 메서드로 맨 뒤의 값만 빼는 식으로 변경했다.
이 코드를 제출하니 대부분 테스트에서 통과가 됐지만, 딱 한가지 테스트에서 실패했다.
잘 생각해보니, 굳이 sort() 메서드를 사용할 필요가 없다는 걸 깨달았다. 우리에겐 Math.min()이 있었다.

function solution(arr) {
    let result = arr.filter((item)=>item!==Math.min(...arr));
    if (result.length===0) return [-1];
    return result;
}

이 코드를 통해 모든 테스트에서 통과를 했다. 사실 내가 간과한 부분이 있었다. filter() 메서드를 썼기에 위의 sort() 메서드를 배열 길이만큼 계속 실행했던 것... 코드의 길이를 줄이기 위해 따로 변수에 넣지 않고 바로 메서드 안에 넣었는데 그게 독이 됐던 것 같다. 두번째 방법을 따로 변수에 넣고 실행하니 통과가 된 걸 보면 확실하다. 코드의 길이를 줄이려다 오히려 비효율적인 코드가 되지 않도록 주의하자.

🍪 배운 것

  • slice() : 어떤 배열의 begin 부터 end 까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환한다. 원본 배열은 바뀌지 않는다. 음수 인덱스는 배열의 끝에서부터의 길이를 나타낸다.

🍴 느낀 점

  • 코드의 길이를 줄이려다 오히려 비효율적인 코드가 되지 않도록 주의하자.
  • 컨디션 관리를 더 잘해서 주말에도 더 학습에 투자를 많이 해야겠다고 느꼈다.

🍳 내일 할 일

  • 알고리즘 특강
  • 개인과제 좌측 빈 공간에 영화 제목 나열 및 클릭 시 해당 카드만 남기는 기능 제작
  • 개인과제 제출
  • JavaScript 문법 종합반 4회차 2회독
profile
웹 프론트엔드 개발자

0개의 댓글