가치투자자

[BOJ] 5086번 : 배수와 약수 본문

Problem Solving/BOJ

[BOJ] 5086번 : 배수와 약수

미주민 2023. 4. 8. 13:13
728x90
반응형

백준 5086번 : 배수와 약수

🔗 문제 링크

https://www.acmicpc.net/problem/5086

 

5086번: 배수와 약수

각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력한다.

www.acmicpc.net

 


💬 문제

 약수 와  배수 에 대한 이해가 있다면, 충분히 풀 수 있는 문제다.

 

  1. 각 줄마다 2개의 수가 주어질 때, 두 수의 관계를 파악해야 한다.

    - 1번째 숫자가 2번째 숫자의 약수면 factor를 출력해준다
    - 1번째 숫자가 2번째 숫자의 배우면 multiple을 출력해준다
    - 둘 다 아니라면 neither를 출력해준다

  2. 마지막 줄에 0이 2개 주어지므로, 이때 출력을 끝내준다.

 


💡 입력값 받아오기

JavaScript로 풀 경우, 입력값(input)을 어떻게 받아와야 할 지가 중요하다.

이 문제에서는 각 줄마다 자연수 2개씩 주어진다. 공백을 기준으로 두 수 a, b를 잘라주고 정수화해준다.

마지막의 "0 0"은 계산해줄 필요가 없으니 input에서 제거해준다.

 

 

입력값을 받아오는 것과 관련해 더 자세한 내용은 아래 링크를 참고 바란다.

https://valueengine.tistory.com/2

 

[BOJ] Node.js로 백준(BOJ) 푸는 법 및 VSCode 환경 세팅

1. Node.js fs모듈 사용법 백준에서 JavaScript로 문제를 풀기 위해선 Node.js를 사용해야 하며, 이때 readline 모듈이나 fs 모듈로 입력값(input)을 받아와야 한다. 이 중 속도나 코드의 길이, 작성 편리성에

valueengine.tistory.com

 

728x90

 


💻 풀이

이 문제는 총 2가지 방식으로 풀 수 있다.

🔑 풀이1 : 나머지 값으로 약수 or 배수 검증

  • 줄바꿈과 공백을 기준으로 input을 잘라주고 모든 수를 정수화해준다.

    - 맨 마지막 [0, 0]은 필요 없으므로 pop()으로 제거해준다
    - input은 [[8, 16], [32, 4], [17, 5]]이 된다
       
  • input에서 map()으로 2개의 수가 담긴 배열을 가져와 각 숫자로 나눠 두 수의 관계를 판단해준다.

    1) 두 번째 수가 첫 번째 수로 나눠지면 "약수(factor)"
    2) 첫 번째 수가 두 번째 수로 나눠지면 "배수(multiple)"
    3) 둘 다 아니라면 "neither"를 출력해준다
// input값 처리
const input = require('fs').readFileSync('/dev/stdin')
  .toString().trim().split('\n').map((v) => v.split(" ").map((v) => +v));
input.pop();  // 맨 끝 [0, 0] 제거

console.log(input.map(function solution(nums) {  // 한 줄씩 입력
  if (nums[1] % nums[0] === 0) {  // 약수
    return 'factor';
  } else if (nums[0] % nums[1] === 0) {  // 배수
    return 'multiple';
  } else {
    return 'neither';  // 둘 다 아닐 때
  }
}).join('\n'));

 

시간은 다음과 같이 걸렸다.

 

 


🔑 풀이2 : Number.isInteger() 메서드

  • 줄바꿈과 공백을 기준으로 input을 잘라주고 모든 수를 정수화해준다.

    - 맨 마지막 [0, 0]은 필요 없으므로 pop()으로 제거해준다
    - input은 [[8, 16], [32, 4], [17, 5]]이 된다
        
  • input에서 map()으로 2개의 수가 담긴 배열을 가져와 각 숫자로 나눠 두 수의 관계를 판단해준다.

    1) 두 번째 수를 첫 번째 수로 나눴을 때, 정수로 딱 나눠떨어지면 "약수(factor)"
    2) 첫 번째 수를 두 번째 수로 나눴을 때, 정수로 딱 나눠떨어지면 "배수(multiple)"
    3) 정수로 딱 떨어지지 않는다면, "neither"를 출력해준다
// input값 처리
const input = require('fs').readFileSync('/dev/stdin')
  .toString().trim().split('\n').map((v) => v.split(" ").map((v) => +v));
input.pop();  // 맨 끝 [0, 0] 제거

console.log(input.map(function solution(nums) {  // 한 줄씩 입력
  if (Number.isInteger(nums[1] / nums[0])) {  // 약수
    return 'factor';
  } else if (Number.isInteger(nums[0] / nums[1])) {  // 배수
    return 'multiple';
  } else {
    return 'neither';  // 둘 다 아닐 때
  }
}).join('\n'));

 

시간은 다음과 같이 걸렸다.

 

 


🎯 풀이를 위한 개념 설명

1. Number.isInteger() 메서드

  • 주어진 값이 정수인지 판단하는 메서드이다.
  • Boolean(참/거짓, true/false)값을 반환한다.
Number.isInteger(매개변수);

 

예시>

Number.isInteger(0);         // true
Number.isInteger(1);         // true
Number.isInteger(-100000);   // true

Number.isInteger(0.1);       // false
Number.isInteger(Math.PI);   // false, Math.PI는 파이(원주율, 3.14)

Number.isInteger(NaN);       // false, NaN (Not a Number)
Number.isInteger(Infinity);  // false, (양의) 무한대
Number.isInteger(-Infinity); // false, (음의) 무한대
Number.isInteger('10');      // false, 문자열
Number.isInteger(true);      // false, Boolean값
Number.isInteger(false);     // false, Boolean값
Number.isInteger([1]);       // false, 배열

 


References

 

728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 1934번 : 최소공배수  (0) 2023.04.15
[BOJ] 2609번 : 최대공약수와 최소공배수  (0) 2023.04.13
[BOJ] 9506번 : 약수들의 합  (0) 2023.04.06
[BOJ] 2501번 : 약수 구하기  (0) 2023.04.06
[BOJ] 11004번 : K번째 수  (0) 2023.04.05