본문 바로가기
코딩테스트/프로그래머스 0단계 - 입문

프로그래머스 0단계 - Day2 사칙연산, 조건문, 배열

by 학습하는 청년 2024. 3. 11.

두 수의 나눗셈

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

  • 0 < num1 ≤ 100
  • 0 < num2 ≤ 100
function solution(num1, num2) {
  const answer = Math.floor(num1 / num2 * 1000);
  return answer;
}

// 다른 풀이 방법
function solution(num1, num2) {
  return Math.trunc(num1 / num2 * 1000);
}

function solution(num1, num2) {
  return ~~(num1 / num2 * 1000);
}

Day1의 다른 사람의 풀이에서 배운 Math.trunc()를 사용하면 정수 조건이 아닌 음수에서도 풀 수 있다.

  • Math.trunc() : 소수점 이하는 버리기
  • Math.floor() : 소수점 이하 내림 // (이 문제에서 조건이 음수까지 포함된다면, 틀린 문제가 된다)

~~연산은 가독성이 좋지 않기 때문에, 쓰지 않는 것을 권한다. 기능은 Math.floor()와 동일하다.


숫자 비교하기

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

  • 0 ≤ num1 ≤ 10,000
  • 0 ≤ num2 ≤ 10,000
// 1. num1 === num2이면 1을 리턴
// 2. num1 !== num2이면 -1을 리턴
// 3. 따라서, 조건이 '음수'였어도 동일한 결과
// 4. if문으로 쓴다.

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

// 다른 사람의 풀이
function solution(num1, num2) {
  if(num1 === num2) {
    return 1;
  } esle {
    return -1;
  }
}

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

function solution(num1, num2) {
  return ((num1 == num2) - 0.5) * 2;
}

지금 돌아보면, let answer = null; 로 작성하는 게 더 적합했던 것 같다. 또한, return의 기능을 제대로 활용할 줄 몰라 이렇게 작성했었다.

 

<다른 사람의 풀이에 대한 이해>

return의 특성을 활용하여 깔끔하게 정리하면, 별로의 변수(answer)를 사용하지 않아도 된다.

 

삼항연산자를 활용하여 if - else를 한 줄로 처리

 

비교연산자의 truth, falsy 값을 활용한 접근

num1 == num2면, true가 되므로 형변환에 의해 1로 계산된다.

num1 != num2면, false가 되므로 형변환에 의해 0으로 계산된다.


분수의 덧셈

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

  • 0 <numer1, denom1, numer2, denom2 < 1,000
// 1.분모의 덧셈 계산식 표현
// 2.분자분모의 최대공약수로 나누기
// 2-1.분자분모 중 작은 수 찾기
// 2-2.작은 수를 분자분모로 나누기
// 2-2-1.둘 다 나누어 떨어지면, 그 수가 최대공약수
// 2-2-2.안 나누어 떨어지면, 작은 수 -1 ==> (2-2)진행

function solution(denom1, numer1, denom2, numer2) {
  let answer = [];
  
  // 1.분모의 덧셈 계산식
  const denom = denom1 * numer2 + denom2 * numer1; // 분자
  const numer = numer1 * numer2;
  
  // 2-1.분자분모 중 작은 수 찾기
  let minNumber;
  if (denom < numer) {
    minNumber = denom;
  } else {
    minNumber = numer;
  }
  
  // 2-2-1.나누어 떨어지는 것 => 나머지가 0인 것
  while(true) {
    if(denom % minNumber === 0) {
      if(numer % minNumber === 0) {
        return [denom / minNumber, numer / minNumber];
      }
    }
    minNumber--;
  }
}


// 다른 사람의 풀이
function solution(denum1, num1, denum2, num2) {
  const denum = (denum1 * num2) + (denum2 * num);
  const num = num2 * num1;
  
  let gd = 1; // 약분할 값
  for(let i = 1; i <= num; i++);
    if(denum % 1 === 0 && num % i === 0) {
      gd = i;
    }
  }
  return [denum / gd, num / gd];
}

<다른 사람의 풀이에 대한 이해>

간결해 보여서 가져와봤다. 풀이와 다른 접근방식이라 생각해보기 좋은 것 같다.

약분할 값을 분모값까지 1부터 1씩 증가시켜 해결하는 방법

- 약수는 최소한 1과 자기자신을 포함하므로 좋은 방법인 것 같다.


배열 두배 만들기

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

  • -10,000 ≤ numbers의 원소 ≤ 10,000
  • 1 ≤ numbers의 길이 ≤ 1,000
// 1. numbers에서 원소를 꺼낸다.
// 2. 원소를 꺼내 2배를 해준다.
// 3. 새 배열에 넣어준다.

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

// 다른 사람의 풀이
function solution(numbers) {
  let answer = [];
  for(let i = 0; i < numbers.length; i++) {
    answer[i] = numbers[i] * 2;
  }
  return answer;
}

function solution(numbers) {
  return numbers.map((v) => v *2);
}

const solution = (numbers) => numbers.map((v) => v * 2);

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

<다른 사람의 풀이에 대한 이해>

직관적인 코드

 

배열 메소드, map()을 사용

- 매개변수로 넣은 값을 2배로 출력해 새 배열로 만들어준다.

 

reduce() 사용


참고

https://youtu.be/uJ4E_1pvI9c?si=aOfCWhlrlEUzwwbV

댓글