본문 바로가기
알고리즘/Programmers

[TIL] 2023.03.19 Programmers 문제 풀기

by heereal 2023. 3. 19.

Today I Learned

  • Programmers 문제 풀기
  • 기술면접 준비

 


Programmers 문제 풀기

제일 작은 수 제거하기

나의 풀이

function solution(arr) {
    let sort_array = arr.sort()
    return arr.length === 1 ? [-1] : arr.filter((num) => num !== sort_array[0]);
}

처음엔 이렇게 풀었는데 sort 메서드를 사용하니까 기존 arr까지 sort가 적용돼서 arr와 sort_array가 동일해졌다. 그래서 결괏값이 sort된 배열로 나와서 문제를 통과하지 못했다.

 

mdn 문서를 보면 관련해서 주의사항(?)이 나와있다.

 

function solution(arr) {
    let copy = [...arr];
    let sort_array = copy.sort()
    return arr.length === 1 ? [-1] : arr.filter((num) => num !== sort_array[0]);
}

그래서 arr를 복사한 후에 복사한 배열에 sort 메서드를 적용해서 풀었다. 그런데 이렇게 풀어도 테스트 케이스를 통과하지 못하는 게 있었다. 문제의 원인은 sort 메서드 사용법에 있었는데, sort 메서드는 숫자 타입이라도 문자열로 반환한 후에 정렬하기 때문에 숫자가 10 이상이 되면 정렬이 이상해진다.

 

const a = [2, 12, 5, 4, 11];

a.sort() // [2, 4, 5, 11, 12]가 아닌 [11, 12, 2, 4, 5]가 리턴
a.sort((a, b) => a - b) // [2, 4, 5, 11, 12]

따라서 compareFunction에 비교식을 추가해줘야한다.

 

최종 풀이

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

맨날 1점 받다가 오랜만에 5점 받음!

 

추가 지식

  • mutator method: 원본 배열을 직접 변경하는 메소드 (ex. sort)
  • accessor method: 원본 배열을 변경하지 않고 새로운 배열을 생성하여 반환 (ex. map, filter)

출처 https://velog.io/@yunsungyang-omc/JS-배열-정렬-메소드-sort

 

 

다른 사람의 풀이 01

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

아... 최솟값을 찾아주는 메서드가 있었구나! 일단 배열에서 최솟값을 구한 다음에 indexOf로 배열에서 해당 인덱스를 구한다. 그리고 인덱스를 이용해서 배열을 splice로 자른다! arr.splice(index, 1)은 해당 index부터 한 개의 요소를 제거하겠다는 뜻이다.

 

  • splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.
const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// Inserts at index 1
console.log(months);
// Expected output: Array ["Jan", "Feb", "March", "April", "June"]

months.splice(4, 1, 'May');
// Replaces 1 element at index 4
console.log(months);
// Expected output: Array ["Jan", "Feb", "March", "April", "May"]

 

 

다른 사람의 풀이 02

function solution(arr) {
    const min = Math.min(...arr);
    return arr.length !== 1 ? arr.filter(i => i !== min) : [-1]
}

나랑 비슷한 풀이 방법인데 sort 메서드를 사용하지 않고 Math.min을 사용했다. sort를 쓰려면 배열을 복사해야 했기 때문에 이 방법이 더 간단한 거 같다.

 

 

문자열 다루기 기본

나의 풀이

function solution(s) {
    return (s.length === 4 || s.length === 6) && !s.split("").map((v) => parseInt(v)).includes(NaN);
}

 

음 좋아~~

다른 사람 풀이 보니까 정규식을 많이 쓴 거 같은데 나는 정규식 잘 쓸 줄 모르기 때문에 그냥 js 메서드로 돌파한다..🥹 정규표현식도 언제 한번 날 잡아서 공부해 봐야겠다.

 


회고

오늘은 알고리즘 문제 몇 개 안 풀었는데도 꽤나 많은 것을 배운 거 같다. 그리고 첫 번째 문제는 몇 번 실패했다가 성공한 문제라 풀어서 매우 뿌듯함!

 

오늘도 열심히...

팀원들과 모의면접을 진행해 볼수록 내가 너무나도 부족하고 준비되어 있지 않다는 게 느껴진다. 하지만 오히려 동기부여가 되기도 했다. 누군가 내가 이렇게 게으름 피울 때가 아니라고 정신 차리라는 의미로 뺨을 한 대 때려준 느낌이랄까😱 기술면접 정말 열심히 준비해야겠다!

댓글