250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
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
관리 메뉴

devlog_owen

[프로그래머스] DAY 2 두수의 나눗셈, 숫자비교하기, 분수의 덧셈, 배열 두배 만들기 본문

algorithm/(js)프로그래머스

[프로그래머스] DAY 2 두수의 나눗셈, 숫자비교하기, 분수의 덧셈, 배열 두배 만들기

developer_owen 2023. 10. 19. 11:55
728x90

 

1.두수의 나눗셈

1)내가 쓴 풀이

const solution = (num1,num2) => Math.floor((num1/num2)*1000)

2)남이 쓴 풀이

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

Math.trunc:소수점 이하의 숫자를 잘라내어 정수 부분만 남기는 연산

Math.trunc():
Math.trunc() 함수는 주어진 숫자의 소수점 아래를 버림하여 가장 가까운 작은 정수를 반환합니다. 즉, 소수점 이하를 버리고 정수 부분만을 반환합니다. 양수에 대해서는 내림이 되고, 음수에 대해서는 올림이 되지 않습니다.

예시:
Math.trunc(3.14)는 3을 반환합니다.
Math.trunc(-5.78)는 -5를 반환합니다.


Math.floor():
Math.floor() 함수는 주어진 숫자보다 작거나 같은 가장 큰 정수를 반환합니다. 즉, 소수점 이하를 버리고 바로 아래의 정수를 반환합니다. 항상 내림을 수행합니다.

예시:
Math.floor(3.14)는 3을 반환합니다.
Math.floor(-5.78)는 -6을 반환합니다.


따라서 주요 차이점은 음수에 대한 처리입니다. Math.trunc()는 단순히 소수점 이하를 버리고 반환하지만, Math.floor()는 항상 내림을 수행하여 더 작은 정수를 반환

 

 

2. 숫자비교하기

1)내가 쓴 풀이

const solution = (num1, num2) =>{
if (num1===num2){
   return 1
} else { return -1 }}
console.log(solution)

2)남이 쓴 풀이

function solution(num1, num2) {
    var answer = num1 === num2 ? 1 : -1;
    return answer;
}

사실 내가 쓴 풀이도 좀 오래 걸렸다. 계속 if문에 console.log()를 넣어서 결과값이 undefined가 나와서 왜이러지 했는데 답은 if 절 안에 return문을 넣고 마지막에 console.log()을 쓰는 거였다.

그러고 남이 쓴 풀이를 봤는데 삼항연산자를 쓴 걸 보고 와우. 이게 더 적절한것같다.

 

삼항 연산자(ternary operator): 조건에 따라 값을 반환하는 간단한 조건부 연산자

일반적으로 if-else 문을 간단하게 표현할 때 사용

 

일반적인 구문: 조건 ? 값1 : 값2


조건이 참이면 값1을 반환합니다.
조건이 거짓이면 값2를 반환합니다.


삼항 연산자는 if-else 문을 간단하고 간결하게 표현할 수 있습니다. 아래는 예시를 보여줍니다:

const age = 20;
const isAdult = age >= 18 ? '성인입니다.' : '미성년자입니다.';

console.log(isAdult);  // 출력: '성인입니다.' (age가 20이므로 조건이 참)


위의 예시에서, age가 18 이상이면 isAdult에는 '성인입니다.'가 할당되고, 그렇지 않으면 '미성년자입니다.'가 할당됩니다.

또한, 삼항 연산자를 중첩하여 복잡한 조건을 처리할 수 있습니다:

const score = 75;
const grade = score >= 90 ? 'A' : (score >= 80 ? 'B' : 'C');

console.log(grade);  // 출력: 'C' (score가 75이므로 조건이 거짓)

 

3.분수의 덧셈

1)내가 쓴 풀이

못품.

2)남이 쓴 풀이

function fnGCD(a, b){
    return (a%b)? fnGCD(b, a%b) : b;
}

function solution(denum1, num1, denum2, num2) {
    let denum = denum1*num2 + denum2*num1;
    let num = num1 * num2;
    let gcd = fnGCD(denum, num); //최대공약수

    return [denum/gcd, num/gcd];
}

거의 한시간 넘게 이 문제만 잡고있었다...아니 잡혀있었다...그러나 나 풀지못했다...

const solution =(numer1,denom1,numer2,denom2) =>{
    const resultNumer = denom1*denom2
    const resultDenom = denom2*numer1+denom1*numer2
    
    return [resultDenom,resultNumer];
}

여기까지는 만들었는데 결과가 기약분수여야 했다. 만 28세에 기약분수 몰라서 구글링한 내 심정, 이해가는가?

초5과정에 기약분수가 나오더군요.

 

fnGCD라는 함수는 두 정수 a와 b의 최대공약수(Greatest Common Divisor, GCD)를 재귀적으로 계산하는 함수입니다. 최대공약수는 두 수가 가장 큰 공통으로 나눌 수 있는 양의 정수를 나타냅니다. 이 함수는 유클리드 알고리즘(Euclidean algorithm)을 사용하여 최대공약수를 찾습니다.

다음은 fnGCD 함수의 동작을 설명합니다:

  1. fnGCD 함수는 두 개의 인수를 받습니다: a와 b.
  2. 함수 내부에서 a % b를 계산합니다. 이것은 a를 b로 나눈 나머지를 나타냅니다.
  3. 만약 a % b가 0이면, b로 나누어 떨어진다는 것을 의미하므로 b가 최대공약수입니다. 따라서 b를 반환합니다.
  4. 그렇지 않으면, a % b가 0이 아니라면 fnGCD 함수를 재귀적으로 호출하고, 이번에는 a에는 b를 대입하고, b에는 a % b를 대입합니다. 이렇게 반복하여 최대공약수를 찾습니다.

유클리드 알고리즘은 두 수의 최대공약수를 효율적으로 찾는 방법 중 하나로, 재귀적인 방식으로 작동하며 매우 효율적입니다. 이 알고리즘은 많은 수학적 및 알고리즘 문제에서 사용됩니다. 함수 fnGCD는 이 알고리즘을 구현한 것이며, 두 수의 최대공약수를 계산하는 데 사용됩니다.

 

 

4.배열 두배 만들기

1)내가 쓴 풀이

못품

2)남이 쓴 풀이

function solution(numbers) {
    return numbers.reduce((a, b) => [...a, b * 2], []);
}
const solution = (numbers) => numbers.map((number) => number * 2)

나의 무능함을 보아라. 앞 문제는 그래도 반은 코드 작성할 수 있었는데 이거는 거의 감도 못잡음.

위에 reduce, map, gcd는 따로 정리해야겠음

 

 

 

 

728x90