Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Leeyanggoo

[코딩테스트 입문] Day-2 사칙연산, 조건문, 배열 본문

2023/코딩테스트

[코딩테스트 입문] Day-2 사칙연산, 조건문, 배열

Leeyanggoo 2023. 4. 30. 23:02

두 수의 나눗셈

정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

function solution(num1, num2) {
    var answer = Math.trunc(1000 * num1 / num2);
    return answer;
}

 

여기서 Math.floor()가 아닌 Math.trunc()를 쓰는 이유는 다음과 같다.

Math.floor()는 "내림" 함수이기 때문에 만약 소수점이 있는 음수가 나온 경우 예상한 값과 다르게 출력될 수도 있다.

-8.1234라는 값이 있다고 할 때 Math.floor는 -9를 출력하지만, Math.trunc() 함수는 소수점 이하를 모두 "제거"하고 정수 부분만 반환하기 때문에 -8이 나온다.

 

숫자 비교하기

정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.

// function solution(num1, num2) {
//     if(num1 === num2){
//         return 1;
//     } else {
//         return -1;
//     }
// }

const solution = (num1, num2) => (num1 === num2) ? 1 : -1

 

처음엔 if else문으로 풀었지만 다른 분들의 풀이를 보고 삼항연산자로 대체해보았다.

if문을 쓸 땐 항상 좀 더 간결하게 표현하는 방법이 있다는 걸 생각해야겠다.

 

분수의 덧셈

첫 번째 분수의 분자와 분모를 뜻하는 numer1denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

// function solution(numer1, denom1, numer2, denom2) {
//     if(denom1 % denom2 == 0){
//         let 분자 = numer1 + (numer2 * (denom1 / denom2));
//         let 분모 = denom1;
//         let answer = [분자, 분모];
//         return answer;
//     } else if(denom2 % denom1 == 0){
//         let 분자 = numer2 + (numer1 * (denom2 / denom1));
//         let 분모 = denom2;
//         let answer = [분자, 분모];
//         return answer;
//     } else if(denom1 % denom2 != 0 || denom2 % denom1 != 0){
//         let 분자 = (numer1 * denom2) + (numer2 * denom1);
//         let 분모 = denom1 * denom2;
//         let answer = [분자, 분모];
//         return answer;
//     }
// }

const solution = (numer1, denom1, numer2, denom2) => {
    let 분자 = (numer1 * denom2) + (numer2 * denom1);
    let 분모 = denom1 * denom2;
    
    // 최대공약수를 찾는 함수
    function gcd(a, b) {
        return b ? gcd(b, a % b) : a;
    }

    // 최대공약수를 구함
    let 최대공약수 = gcd(분자, 분모);

    // 분자와 분모를 최대공약수로 나눠 기약분수로 변환
    let answer = [분자 / 최대공약수, 분모 / 최대공약수];
    return answer;
}

 

처음엔 기약 분수가 뭔지도 모르고 작성했다가 호되게 혼났던 문제.

최대공약수를 구해야 한다는 건 알았지만 방법을 몰라 친구(GPT)에게 물어보았다...

해당 함수는 "유클리드 알고리즘" 혹은 "유클리드 호제법"이라고 하며 두 양수의 최대공약수를 재귀적인 방법으로 구한다.

여기서 말하는 재귀적인 방법 혹은 재귀적으로 호출한다는 것은 함수가 자기 자신을 호출하는 걸 의미한다.

 

배열 두 배 만들기

정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.

function solution(numbers) {
    let answer = [];
    for(let i=0; i<numbers.length; i++){
        answer[i] = numbers[i] * 2;
    }
    return answer;
}

 

앞서 변수 answer를 배열로 선언한 뒤에 for문을 사용해 값을 넣고 for문이 끝난 뒤 호출하여 문제를 풀었다.