본문 바로가기
개발 기초 다지기

내일배움캠프 24일차 : 알고리즘 문제 정리(없는 숫자 더하기, 제일 작은 수 제거하기, 가운데 글자 가져오기, 내적, 약수의 개수와 덧셈)

by 너의고래 2024. 5. 20.
반응형

<문제1 : 없는 숫자 더하기>

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

 

제한사항

  • 1 ≤ numbers의 길이 ≤ 9

입출력 예

numbers result
[1,2,3,4,6,7,8,0] 14
[5,8,4,0,6,7,9] 6

입출력 예 설명

입출력 예 #1

  • 5, 9가 numbers에 없으므로, 5 + 9 = 14를 return 해야 합니다.

입출력 예 #2

  • 1, 2, 3이 numbers에 없으므로, 1 + 2 + 3 = 6을 return 해야 합니다.

 

- 내가 푼 풀이

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

 

for문을 이용해 1~9 사이의 i값을 포함하지 않을 경우 더해주었다.

  • includes() : 특정 요소가 포함하는지 확인하는 함수로, 요소가 포함되어있으면 'true', 아니면 'false'를 반환

 

- 다른 풀이

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

 

내가 처음으로 생각했던 풀이 방법. 0~9라는 작은 범위라서 구현해볼까하다가 범위가 커질경우를 대비해 위 방법으로 풀이를 진행하였다.

 

 

 

 

<문제2 : 제일 작은 수 제거하기>

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

 

제한 조건

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

입출력 예

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

 

 

- 내가 푼 풀이

function solution(arr) {
    var answer = [];
    
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    arr.length < 1 ? answer= [-1] : answer = arr;

    
    return answer;
}

 

Math.min()을 이용해서 배열에서 가장 작은 값을 찾는다.

arr.indexOf()를 통해 배열에서 가장 작은 값의 위치를 찾는다

arr.splice()를 통해 찾은 가장 작은 값의 위치의 요소 1개를 제거한다

arr의 길이를 통해 -1을 반환할지 제일 작은 수를 제거한 arr를 반환할지 결정한다

 

  • array.splice(start, deleteCount, item1, item2, ..., itemN) : 배열의 내용을 추가, 제거 또는 교체할 사용하는 메서드
    start : 배열 변경 시작할 인덱스 / deleteCount : 제거할 요소 개수 / item1, item2, ..., itemN : 배열에 추가할 요소
  • indexOf(searchValue, fromIndex) :배열 또는 문자열 내에서 특정 요소나 문자의 번째 발생 위치를 반환하는 메서드
    searchValue : 검색할 문자, fromIndex : 검색을 시작할 인덱스. 기본값 '0'
  • Math.min() :주어진 숫자 중에서 가장 작은 값을 반환하는 함수
  • ...arr : 스프레드 연산자로 배열이나 이터러블 객체의 모든 요소를 개별적인 인수로 분리합니다.
    , 배열 arr 요소를 하나씩 Math.min 함수에 전달하는 역할

 

- 다른 풀이

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

 

내 풀이와 동일하게 가장 작은 값을 구해 정의해준다.

arr의 길이가 1개가 아닐 경우, 최소값과 일치하지 않는 값만 모아 새로운 배열로 반환한다.

  • Array.prototype.filter() : 배열의 요소를 테스트하여 조건을 만족하는 요소들만 모아 새로운 배열로 반환

 

 

 

<문제3 : 가운데 글자 가져오기>

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

 

제한 사항

  • s는 길이가 1 이상, 100이하인 스트링입니다.

입출력 예

s return
"abcde" "c"
"qwer" "we"

 

 

- 내가 푼 풀이

function solution(s) {
    var answer = '';
    
    let len = s.length;
    let cen = Math.floor(len/2)
    if(len % 2 == 0){
        answer = s.slice(cen-1, cen+1)
    } else {
        answer = s.slice(cen, cen+1);
    }
    
    return answer;
}

 

s의 길이를 len으로 정의내린 후 이걸 반으로 나눈 값을 정수로 추출해 s의 중간 부근을 가리킬 수 있는 상태로 만들어줌

len이 짝수일 경우 cen이 가리키는 인덱스가 추출해야 하는 값보다 1 크기 때문에 -1을 한 후 그 다음 인덱스 값까지 빼준다.

len이 홀수일 경우 cen이 딱 중앙값을 가리키기 때문에 그 값 하나만 빼준다.

 

  • Math.floor() : 주어진 숫자보다 크지 않은 가장 정수를 반환하는 함수
  • array.slice([begin[, end]]) : 배열의 일부를 추출하여 새로운 배열로 반환하는 사용
    begin : 추출 시작점의 인덱스 / end : 추출 종료점의 인덱스 (해당 인덱스의 요소는 포함되지 않음

- 다른 풀이

function solution(s) {
    return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);
}

 

 

- 다른 풀이

function solution(s) {
    const mid = Math.floor(s.length/2);
    return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}

 

 

 

 

반응형

댓글