KassyLog

제일 작은 수 제거하기 본문

algorithms

제일 작은 수 제거하기

Kassy_kim 2023. 2. 4. 00:16

알고리즘 문제를 풀다보니 문제 해결에 어려움을 겪었던 문제가 있어서 따로 정리해보려한다.

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

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

출력 예시

arr return
[4,3,2,1] [4,3,2]
[10] [-1]

 

before

아래의 코드는 테스트 코드는 통과하고 유효성 검사에서 모두 실패한 코드이다.

function solution(arr) {
    var answer = [];
    if (arr.length == 1) {
        answer.push(-1)
    } else {
        answer = arr.sort((a,b)=>b-a).slice(0, arr.length - 1);
    }
    return answer;
}

내가 생각한 방향은

1. 배열의 길이가 1일 경우는 가장 작은 수가 그 1개이기에 -1을 도출하기로 하고

2. 내림차순으로 배열을 정렬한 다음 가장 마지막에 있는 원소를 지우고 도출하는 것이었다.

 

하지만 배열의 순서 자체가 의미있는 데이터일 수 있기 때문에 섣불리 sorting을 하는 습관을 가지면 안된다라는 검색 결과가 있었고, 코드가 작동해도 효율성이 떨어지면 탈락되는 경우도 있어서 실용성을 생각하고 sort를 사용하지 않는 코드를 작성했다.

 

after

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

indexOf와 Math.min을 활용하여 가장 작은 수의 인덱스를 찾아내서 splice로 제거해주는 방법을 사용했으며, 남아있는 원소값이 없다면 (즉, before의 if문 같은) [-1]을 return 하게끔 코드를 작성했다.

 

 

*오늘 사용한 메소드 알아보기

indexOf()

str.indexOf(searchValue[, fromIndex])

 

searchValue

찾으려는 문자열. 아무 값도 주어지지 않으면 문자열 "undefined"를 찾으려는 문자열로 사용

fromIndex (optional)

문자열에서 찾기 시작하는 위치를 나타내는 인덱스 값

기본값은 0이며, 문자열 전체를 대상으로 찾게 됩니다. 만약 fromIndex 값이 음의 정수이면 전체 문자열을 찾게 된다. 만약 fromIndex >= str.length 이면, 검색하지 않고 바로 -1을 반환하고 searchValue가 공백 문자열이 아니라면, str.length를 반환

 

String.prototype.indexOf() - JavaScript | MDN

indexOf() 메서드는 호출한 String 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환합니다. 일치하는 값이 없으면 -1을 반환합니다.

developer.mozilla.org

Math.min()

    Math.min([value1[, value2[, ...]]])

주어진 숫자들 중 가장 작은 값.

만약 적어도 1개 이상의 인자값이 숫자형으로 변환이 불가능 한 경우 이 함수는 NaN 를 반환 

 

Math.min() - JavaScript | MDN

Math.min() 함수는 주어진 숫자들 중 가장 작은 값을 반환합니다.

developer.mozilla.org

splice()

 

splice와 slice의 차이점

이 둘은 배열을 이어붙이거나 제거할 때 사용하는 메소드라는 공통점을 가지고 있지만 slice는 "조각"뜻의 명사이고 splice는 "이어붙이다"뜻의 동사인 것처럼 중요한 차이점을 가지고 있다. 1. splic

gagyeong.tistory.com

sort()

 

sort( ) : 오름차순, 내림차순 정렬하기

arr.sort([compareFunction]) compareFunction (optional) 정렬 순서를 정의하는 함수. 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬. 정렬한 배열은 복사본이

gagyeong.tistory.com

 

'algorithms' 카테고리의 다른 글

[프로그래머스] 완주하지 못한 선수  (1) 2024.03.29
시간복잡도란?  (0) 2023.02.20