Lsiron

코딩테스트 6(Math.sqrt, isInteger, split, sort, reverse, join, isNaN, parseInt) 본문

코딩테스트/Java Script

코딩테스트 6(Math.sqrt, isInteger, split, sort, reverse, join, isNaN, parseInt)

Lsiron 2024. 6. 4. 03:54

문제 1. 내적

 

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

 

풀이=해답.

function solution(a, b) {
    let answer = 0;
    for(let i = 0 ; i < a.length ; i += 1){
        answer += a[i] * b[i]
    }
    return answer;
}

 

=> 근본으로 풀었다. 1, 2, 3, 4, 5, 6 이렇게 값을 넣어야 한다는 걸 알면 반복문으로 풀면 되기 때문에 문제 의도만 파악하면 풀기 쉬워진다. 두 배열이 같은 길이여야 한다는 점이 흠이다.

 

// 출제자의 의도부터 파악을 했다. 점점 문제를 풀기 시작하면 의도 먼저 파악을 하려고 한다. 두 배열의 길이가 같고, 순차적으로 진행되는거라면..? 두 배열을 함께 반복문을 돌리면 될 것이라 생각했다.

 

문제 2. 약수의 개수와 덧셈

 

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

 

풀이 = 해답.

function solution(left, right) {
    let answer = 0;
    for (let num = left; num <= right; num += 1) {
        let divisors = 0;
        for (let i = 1; i <= num; i += 1) {
            if (num % i === 0) {
                divisors += 1;
            }
        }
        if (divisors % 2 === 0) {
            answer += num;
        } else {
            answer -= num;
        }
    }
    return answer;
}

 

=>  역시나 근본으로 풀었다. 일단 left부터 right 까지의 수의 약수의 개수를 구하고 개수가 짝수면 + 홀수면 - 이기 때문에 

중첩 반복문을 사용했다. 내부 반복문에는 약수의 개수를 구하는 반복문, 외부 반복문에는 개수에 따른 연산을 해 주었다. 외부 반복문이 +1 씩 될 때마다 변수를 초기화 하는 점을 이용했다. 약수의 개수를 구하는 반복문은 너무나도 많이 접했기 때문에 이제는 외운수준이다.

 

// 처음에 약수의 개수를 구하는 부분에서 뇌정지가 왔다. 허나 외부 반복문에 변수를 설정했을때 반복 할때마다 변수가 초기화 되지 않을까 하는 생각이 딱 들어 맞았다. 덕분에 반복 할 수록 divisors 가 초기화 되기 때문에 수월하게 약수의 개수를 구할 수 있었다.

 

외전.

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

 

=> 허나 유익한 해답을 하나 찾았다. 제곱근이 정수면 약수의 개수는 홀수 라는 것 이다. 이 분은 이를 통해 반복문을 단 하나만 쓰고 수월하게 풀 수 있었다. 내장함수를 쓸 수 없는 문제라고 생각했는데 아니었다.

 

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

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

 

풀이 = 해답.

function solution(s) {
    return s.split('').sort().reverse().join('');
}

 

=> split을 통해 배열로 바꾸어준뒤, sort를 사용하여 문자를 먼저 오름차순으로 바꾸어주고 reverse를 통해 역순으로 바꾼다.(=내림차순으로 정렬) 이후 다시 join을 통해 문자열로 바꾸어주면 된다.

 

// 내장함수의 향연이였다. 며칠 전에 sort에 대해 자세하게 알아보았는데 많은 도움이 되었다. 

흔히 sort를 숫자 오름차순 내림차순으로 생각하는데 이는 아니다.

arr.sort((a, b) => a - b) 는 오름차순 , arr.sort((a, b) => b - a) 는 내림차순으로 알고 있는데 이는 숫자에만 해당이 된다.

문자열은 그냥 arr.sort()만 해줘도 알아서 오름차순으로 해준다. 그럼 문자열 내림차순은? 그냥 문자열 오름차순 한 곳에 reverse() 함수를 사용하여 역순으로 바꿔주면 된다.

 

문제 4. 부족한 금액 계산하기.

 

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

 

풀이=해답. 

function solution(price, money, count) {
    let total = 0;
    for(let i = 1 ; i <= count ; i += 1){
        total += price * i
    }
    return total > money ? total - money : 0;
}

 

 

=> 반복문과 삼항연산자만 알고 있으면 간단히 풀리는 문제였다. 반복문을 통해 가격과 횟수를 곱해주고 빈 값에 총 가격을 넣어주었다. 이 토탈값이 가지고 있는 돈 보다 많으면 부족한 금액을 반환하도록 하고 아니면 0을 반환하도록 하였다.

 

//  정석대로 푼 것 같다. 이 이상 좋은 방법은 없다고 생각이 들었다.

 

문제 5. 문자열 다루기 기본.

 

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

 

풀이.

function solution(s) {
  if (s.length === 4 || s.length === 6) {
    for (let i = 0; i < s.length; i++) {
      if (isNaN(parseInt(s[i]))) {
        return false;
      }
    }
    return true;
  } else {
    return false; 
  }
}

 

=> 문자열의 길이가 4 혹은 6인지 판별하는 조건문에 s가 문자열을 포함하는지 확인하는 반복문을 넣었다. 더 간단하게 있을 거 같았는데, 문제 제출 후 결과를 보면 하나씩 틀린 값이 나와서 그냥 반복문으로 풀어보았다.

 

 

해답.

function alpha_string46(s) {
   return s.length == 4 || s.length == 6 ? !isNaN(s) : false 
}

 

=> 가장 깔끔한 해답이 있었다. isNaN()은 숫자가 아닌 것을 판별하는 함수(!isNaN이기 때문에 숫자일 시, true 반환 아닐 시, false 반환)라고 한다. 유용하게 써야겠다. 또한 자동으로 이 함수는 true 또는 false를 반환하기 때문에 굳이 반환값을 넣어줄 필요가 없어서 삼항연산자로 만든것으로 보인다.

 

//  정석대로 푼 것 같다. 이 이상 좋은 방법은 없다고 생각이 들었다.

 

하루 총평.

점점 문제를 푸는 시간이 길어진다. 의도를 파악하려다 보니 시간이 많이 흘러가고, 나름 풀이로 해보아도 몇 문제 오류가 나는 점이 보인다. 문제를 되도록 많이 푸는편이 이득으로 보인다. 아직 경험이 없으니 배울 것이 많다.