Notice
Recent Posts
Recent Comments
Link
가치투자자
[BOJ] 5086번 : 배수와 약수 본문
728x90
반응형
백준 5086번 : 배수와 약수
🔗 문제 링크
https://www.acmicpc.net/problem/5086
5086번: 배수와 약수
각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력한다.
www.acmicpc.net
💬 문제
약수 와 배수 에 대한 이해가 있다면, 충분히 풀 수 있는 문제다.
- 각 줄마다 2개의 수가 주어질 때, 두 수의 관계를 파악해야 한다.
- 1번째 숫자가 2번째 숫자의 약수면 factor를 출력해준다
- 1번째 숫자가 2번째 숫자의 배우면 multiple을 출력해준다
- 둘 다 아니라면 neither를 출력해준다 - 마지막 줄에 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 |