평행
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
•
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
function solution(dots) {
// 0과 1 + 2와 3
if ( (dots[0][1] - dots[1][1]) / (dots[0][0] - dots[1][0]) === (dots[2][1] - dots[3][1]) / (dots[2][0] - dots[3][0]) ) {
return 1;
}
// 0과 2 + 1과 3
if ( (dots[0][1] - dots[2][1]) / (dots[0][0] - dots[2][0]) === (dots[1][1] - dots[3][1]) / (dots[1][0] - dots[3][0]) ) {
return 1;
}
// 0과 3 + 1과 2
if ( (dots[0][1] - dots[3][1]) / (dots[0][0] - dots[3][0]) === (dots[1][1] - dots[2][1]) / (dots[1][0] - dots[2][0]) ) {
return 1;
}
return 0;
}
JavaScript
복사
함수 선언하여 코드 정리
function solution(dots) {
if (calculateSlope(dots[0], dots[1]) === calculateSlope(dots[2], dots[3]))
return 1;
if (calculateSlope(dots[0], dots[2]) === calculateSlope(dots[1], dots[3]))
return 1;
if (calculateSlope(dots[0], dots[3]) === calculateSlope(dots[1], dots[2]))
return 1;
return 0;
}
function calculateSlope(arr1, arr2) {
return (arr2[1] - arr1[1]) / (arr2[0] - arr1[0]);
}
JavaScript
복사
OX 퀴즈
덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.
생각하기 쉬운 풀이
function solution(quiz) {
var answer = [];
return quiz.map(t => {
const [calc, result] = t.split(' = ');
const sign = calc.includes('+') ? 1 : -1
const [a, b] = calc.split(sign === 1 ? ' + ' : ' - ');
return +a + (+b * sign) === +result ? 'O' : 'X'
});
}
JavaScript
복사
eval() 활용 풀이
// eval()은 문자열 수식의 계산 결과를 return함
function solution(quiz) {
let ans = [];
for (let q of quiz) {
let c = q.split('=');
ans.push(eval(c[0]) == c[1] ? 'O' : 'X');
}
return ans;
}
JavaScript
복사
로그인 성공?
머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.
•
아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
•
로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.
function solution(id_pw, db) {
let result = "fail";
db.map((e) => {
if ( e[0] === id_pw[0] ) {
if ( e[1] === id_pw[1] ) {
result = "login";
} else {
result = "wrong pw";
}
}
})
return result;
}
JavaScript
복사
Map 객체 활용
function solution(id_pw, db) {
const [id, pw] = id_pw;
const map = new Map(db);
return map.has(id) ? (map.get(id) === pw ? 'login' : 'wrong pw') : 'fail';
}
JavaScript
복사
구슬을 나누는 경우의 수
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.
재귀 팩토리얼
const fact = (num) => num === 0 ? 1 : num * fact(num - 1)
// round()를 통해 소수점을 안정화해야 통과됨 !!
function solution(balls, share) {
return Math.round(fact(balls) / fact(balls - share) / fact(share))
}
JavaScript
복사
팩토리얼 메모이제이션 + BigInt
// BigInt는 Number원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.
// BigInt는 정수 리터럴의 뒤에 n을 붙이거나(10n) 함수 BigInt()를 호출해 생성할 수 있다.
// BigInt와 Number는 차이가 있는데, BigInt는 내장 Math 객체의 메서드와 함께 사용할 수 없고, 연산에서 Number와 혼합해 사용할 수 없다.
// 따라서 먼저 같은 자료형으로 변환해야 한다. 그러나, BigInt가 Number로 바뀌면 정확성을 잃을 수 있으니 주의해야 한다.
function solution(balls, share) {
let factorial = [BigInt(1)];
for (let i = 1; i <= balls; i++) {
factorial[i] = factorial[i - 1] * BigInt(i);
}
return factorial[balls] / (factorial[balls - share] * factorial[share]);
}
JavaScript
복사
팩토리얼 공식 대체 풀이
while()을 사용하여 share가 0이 되기 전까지 -1을 하여 팩토리얼 공식을 대체. 리턴 부분에서 Math.round()를 한 이유는 테스트의 반례로 결과값이 소수점이 되는 경우가 있어 반올림을 하여 리턴
function solution3(balls, share) {
let answer = 1;
while (share) {
//share가 0이 되기 전까지
answer *= balls / share;
balls--;
share--;
}
return Math.round(answer);
}
JavaScript
복사