241122 과제

수달·2024년 11월 24일

Lv.1 문제 7개 풀이

1. 가운데 글자 가져오기

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

처음 풀이

function solution(s) {
    let arr = [];
    let ans = '';
    arr = s.split('');
    
    for(let i = 0 ; i<arr.length ; i++) {
        if(arr.length % 2 === 0) {
            let join = [];
             join = arr.slice(arr.length / 2 - 1, arr.length / 2 + 1); 
            ans = join.join('');
        }
        else {
            let middle = Math.floor(arr.length / 2);
        ans = arr[middle];
        }
    }
    return ans;
}

처음에는 for문에 집착해서 풀었는데 for문이 불필요하단 것을 깨달았다...
그리고 복잡하게 join 까지 쓸 필요가 없었다.

개선 풀이

function solution(s) {
    let length = s.length;
    let middle = Math.floor(length / 2);

    if (length % 2 === 0) {
        return s[middle - 1] + s[middle];
    } else {
        return s[middle];
    }
}

2. 약수의 개수와 덧셈

  • 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

처음 풀이

function solution(left, right) {
    let arr = [];
    let sum = 0;
   
    for (let i = left ; i<right+1 ; i++) {
         let count = 0;
        for (let j = 1 ; j<=i ; j++) {      
            if(i % j === 0) {
                count++;
            }
            arr[i - left] = count;
        }
        
        
    }
  for (let i = 0; i < arr.length; i++) {
        if (arr[i] % 2 === 0) {
            sum += (i + left); 
        } else {
            sum -= (i + left);
        }
    }

    return sum; 
}

이중 for문을 써야한다는 건 알았지만.. 불필요한 부분이 많았다.
1. count를 배열로 만들지 않아도 된다.
2. 하나의 for문에서 다 끝낼 수 있다는 걸 깨달았다.

개선 풀이

function solution(left, right) {
    let sum = 0;

    for (let i = left; i < right+1; i++) {
        let count = 0;

        for (let j = 1; j <= i; j++) {
            if (i % j === 0) {
                count++;
            }
        }

        if (count % 2 === 0) {
            sum += i;
        } else {
            sum -= i;
        }
    }

    return sum;
}
  1. 바깥 for문: left~right까지 반복
  2. 안쪽 for문: 약수 구하기
  3. 안쪽 if문: for문 종료 후 그 수에 대한 count가 짝수인지 홀수인지 구별해 sum에 넣기

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

  • 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
    s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

풀이

function solution(s) {
    let ans = '';
    arr = s.split('');
    arr.sort(function(a, b) {
       if(a > b) return -1;
       if (a < b) return 1;
       return 0; 
    });
    ans = arr.join('');
    return ans
}
  1. split 문자열 내장 객체
  2. sort 배열 내장 객체 : 문자열의 유니코드 값 기준 정렬
    a > b이면 -1을 반환하여 a를 b보다 앞에 둠
    a < b이면 1을 반환하여 b를 a보다 앞에 둠
  3. join 배열 내장 객체

4. 제일 작은 수 제거하기

  • 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
function solution(arr) {
    let ans = [];
    let min = 100000000000000000000000;
    let index = 0;
    if(arr.length > 1) {
        for (let i = 0 ; i<arr.length ; i++) {
            if(min > arr[i]) {
                min = arr[i];
                index = i;
            }
        }
        arr.splice(index, 1);
        ans = arr;
    }
    else {
        ans.push(-1);
    }
    
    return ans;
}

5. 없는 숫자 더하기

  • 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
function solution(numbers) {
    let ans = 0;
    for (let i= 0 ; i<10 ; i++) {
        if (!numbers.includes(i)) {
        ans += i;
        }
    }
    return ans;
}

include 배열 내장 객체로 요소 존재 확인

6. 최대공약수와 최소공배수

  • 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
function gcd(n, m) {
    if (m === 0) return n;
    return gcd(m, n % m); 
}

function lcm(n, m) {
    let yak = gcd(n, m); 
    return (n * m) / yak;  
}

function solution(n, m) {
    let yak = gcd(n, m);  
    let bae = lcm(n, m);  

    return [yak, bae];
}

복습했다.

7. 최댓값과 최솟값

  • 문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
    예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.
function solution(s) {
    var answer = '';
    const arr = s.split(' ').map(Number);
    let min = arr[0];
    let max = arr[0];

    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < min) {
            min = arr[i]; 
        }
        if (arr[i] > max) {
            max = arr[i]; 
        }
    }
    
    return `${min} ${max}`;
}
  1. s를 숫자 배열로 전환
  2. 최솟값 최댓값 확인

0개의 댓글