📢 공지사항
home
🏡

8주차 해설

태그
배열
문자열
확통
종류
문제

평행

점 네 개의 좌표를 담은 이차원 배열  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
복사