Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 항해99
- JavaScript
- 데이터베이스시스템
- 99클럽
- 유노코딩
- 중간이들
- 파이썬프로그래밍기초
- nestjs
- Git
- presignedurl
- node.js
- 방송대
- MySQL
- 코딩테스트
- 코딩테스트준비
- redis
- SQL
- 코드잇
- Python
- 프로그래머스
- CSS
- Cookie
- 방송대컴퓨터과학과
- 엘리스sw트랙
- TiL
- 꿀단집
- 개발자취업
- HTML
- 파이썬
- aws
Archives
- Today
- Total
배꼽파지 않도록 잘 개발해요
[프로그래머스] 입문 Day 2 사칙연산, 조건문, 배열 (Javascript) 본문
두 수의 나눗셈
문제설명
- 정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.
제한사항
- 0 < num1 ≤ 100
- 0 < num2 ≤ 100
입출력 예시
num1 | num2 | result |
3 | 2 | 1500 |
7 | 3 | 2333 |
1 | 16 | 62 |
풀이 1
Math.floor() 함수
function solution(num1, num2) {
var answer = Math.floor((num1 / num2) * 1000);
return answer;
}
풀이 2
Math.trunc() 함수
function solution(num1, num2) {
return Math.trunc(num1 / num2 * 1000); // 소수점 절삭
}
숫자 비교하기
문제 설명
- 정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ num1 ≤ 10,000
- 0 ≤ num2 ≤ 10,000
입출력 예
num1 | num2 | result |
2 | 3 | -1 |
11 | 11 | 1 |
7 | 99 | -1 |
풀이 1
if - else문
function solution(num1, num2) {
if (num1 == num2){
return 1;
}
else{
return -1;
}
}
풀이 2
삼항연산자
function solution(num1, num2) {
answer = num1 == num2 ? 1 : -1
return answer;
}
// 삼항연산자
condition (조건) ? expression1 (참) : expression2 (거짓)
분수의 덧셈
문제 설명
- 첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 <numer1, denom1, numer2, denom2 < 1,000
입출력 예
numer1 | denom1 | numer2 | denom2 | result |
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29. 6] |
풀이 1
for 반복문으로 분자와 분모의 최대공약수 구하기
function solution(numer1, denom1, numer2, denom2) {
// 일단 통분해서 덧셈한 분수 구하기 → 분모와 분자의 최대공약수로 나눈다
let den = denom1 * denom2; // 분모
let num = numer1 * denom2 + numer2 * denom1; // 분자
let gda; // 최대공약수
// 분모와 분자의 최대공약수 구하기
for (let i = 1; i <= Math.min(den, num); i++) {
if ((den % i == 0) && (num % i == 0)) {
gda = i;
}
}
// 분자와 분모의 최대공약수로 나눈 분수 출력
answer = [num/gda, den/gda]
return answer;
}
풀이 2
유클리드 호제법으로 최대공약수 찾아서 계산하기
function solution(numer1, denom1, numer2, denom2) {
// 유클리드 호제법을 사용하여 최대공약수(GCD)를 찾는 함수
const findGCD = (a, b) => (b === 0 ? a : findGCD(b, a % b));
// 두 분수를 통분하여 더한 분자와 분모 계산
const den = denom1 * denom2; // 분모
const num = numer1 * denom2 + numer2 * denom1; // 분자
// 분모의 최대공약수를 구함
const gcd = findGCD(denom1, denom2);
// 최대 공약수로 분모와 분자를 나누어 간단한 형태의 분수로 반환
return [num / gcd, den / gcd];
}
// 유클리드 호제법으로 최대 공약수 찾기
(b === 0 ? a : findGCD(b, a % b))
// b가 0 : a가 최대공약수이므로 a를 반환
// b가 0이 아니면 : b와 a를 b로 나눈 나머지의 최대 공약수를 찾음
예시)
findGCD(48, 18) ---> a = 48, b = 18
findGCD(18, 12) ---> a = 18, b = 12
findGCD(12, 6) ---> a = 12, b = 6
findGCD(6, 0) ---> a = 6, b = 0
b === 0 이므로 a를 반환
최대공약수는 6이 됨.
주의할 점
- 이 문제는 수학적인 내용을 어느 정도 숙지하고 있어야 풀 수 있는 문제였다. 그래서 레벨 0 문제 중에서도 정답률이 낮다.
- 두 번째 풀이 같은 경우에는 재귀 호출에 대해 알고 있어야 풀 수 있다.
배열 두 배 만들기
문제 설명
- 정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- -10,000 ≤ numbers의 원소 ≤ 10,000
- 1 ≤ numbers의 길이 ≤ 1,000
입출력 예
numbers | result |
[1, 2, 3, 4, 5] | [2, 4, 6, 8, 10] |
[1, 2, 100, -99, 1, 2, 3] | [2, 4, 200, -198, 2, 4, 6] |
풀이 1
배열을 생성해서 입력값에 두 배를 하여 원소를 추가
function solution(numbers) {
var answer = []; // 배열 생성
for (i = 0; i < numbers.length; i++) {
answer.push(numbers[i] * 2) // 입력받은 값에 두 배를 하여 원소 추가
}
return answer;
}
풀이 2
reduce 함수 활용
function solution(numbers) {
return numbers.reduce( (a, b) => [...a, b * 2], [])
}
reduce 함수
· 배열의 각 요소에 대해 주어진 콜백함수 실행, 그 결과를 누적하여 최종 결과를 반환하는 고차함수
· 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback 함수를 한 번씩 실행
arr.reduce(callback[, initialValue])
- (a, b) => [...a, b * 2] : a에 b를 2배한 값이 누적한 새로운 배열을 반환함
- a : accumulator, 누적 값
- b : currentValue, 현재 요소
- [] : reduce 함수의 초기값 (초기값 입력하면 초기값 다음의 인덱스부터 값이 들어옴)
reduce 함수를 활용한 배열의 원소 변형
const numbers = [1, 2, 3, 4, 5];
const result = numbers.reduce((accumulator, currentElement) => {
// ...accumulator는 이전까지 누적된 배열을 전개
// currentElement * 2는 현재 요소를 3배로 만든 값에 1 추가
return [...accumulator, currentElement * 3 + 1];
}, []);
console.log(result);
초기값을 지정해주지 않으면 배열이 발생함.
초기값을 빈 배열로 설정하면 항상 배열이 반환됨.
const numbers = [1, 2, 3, 4]
const result1 = numbers.reduce((a, b) => [...a, b * 2]);
console.log(result1) // TypeError: a is not iterable
const result2 = numbers.reduce((a, b) => [...a, b * 2], []);
console.log(result2) // [2, 4, 6, 8]
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
Array.prototype.reduce() - JavaScript | MDN
reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
developer.mozilla.org
주의할 점
- reduce 함수를 제대로 공부해보지 않아서 두 번째 풀이는 어려웠다.
- 문제 풀이보다 자바스크립트에 대해 모르고 있는게 더 많은 것 같아서, 모던 자바스크립트 공부부터 제대로 해야겠다는 생각이 든다.
728x90
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 입문 Day 6 문자열, 반복문, 출력, 배열, 조건문 (Javascript) (0) | 2023.12.15 |
---|---|
[프로그래머스] 입문 Day 5 수학, 배열 (Javascript) (0) | 2023.12.15 |
[프로그래머스] 입문 Day 4 수학, 배열 (Javascript) (0) | 2023.12.14 |
[프로그래머스] 입문 Day 3 사칙연산, 배열, 수학 (Javascript) (0) | 2023.12.12 |
[프로그래머스] 입문 Day 1 사칙연산 (Javascript) (0) | 2023.12.11 |