일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웅진씽크빅
- App Runner
- 프로세스
- 개발자부트캠프
- BFS
- 스나이퍼팩토리
- 해시
- 스레드
- cs #네트워크
- react
- 타입스크립트
- javascript
- 알고리즘
- 인사이드아웃
- 리액트
- Algorithm
- react-query
- 네트워크
- 프로젝트캠프
- typescript
- React.js
- html
- 메모리
- 프로그래머스
- IT개발캠프
- 유데미
- CS
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- ip
- 자바스크립트
- Today
- Total
Bin's Blog
[프로그래머스] Level2 - 숫자 카드 나누기(Javascript) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▶️▶️ 문제 요약
1️⃣ 철수와 영희는 선생님으로 부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 한다.
2️⃣ 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
3️⃣ 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고, 철수가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
4️⃣ 철수가 10, 20이 적힌 카드, 영희가 5, 17이 적힌 카드로 나눠 가졌다면 조건에 해당하는 양의 정수 a는 10이 된다.5️⃣ 만약 조건을 만족하는 a가 없다면, 0을 return 해라
✅ 정답 코드
// 최대공약수 함수
function gcd(a, b) {
if (b === 0) {
return a;
} else {
return gcd(b, a % b)
}
}
// 현재 배열에서 최대공약수 찾기
function gcdOfArray(array) {
let gcdValue = array[0];
for (let i = 1; i < array.length; i++) {
gcdValue = gcd(gcdValue, array[i]);
}
return gcdValue
}
// 주어진 두 배열의 약수
function gcdDivision(n) {
let arr = [];
for (let i = n; i > 0; i--) {
if (n % i === 0) {
arr.push(i);
}
}
return arr
}
// 배열의 요소가 나눠 떨어지는지를 확인하는 함수
function isDivision(array, max) {
for (let a of array) {
if (a % max === 0) {
return true;
}
}
return false;
}
function solution(arrayA, arrayB) {
// A배열과 B배열의 최대공약수 찾기
let gcdA = gcdOfArray(arrayA);
let gcdB = gcdOfArray(arrayB);
// 그중에 최댓값
let a = Math.max(gcdA, gcdB);
// 최댓값의 약수 찾기
let divisions = gcdDivision(a);
// 약수를 돌면서(큰 수 => 작은 수)
for (let division of divisions) {
// 최댓값이 A배열에서 나왔으면
if (gcdA === a) {
// B배열을 확인 후 일치하지 않으면
if (!isDivision(arrayB, division)) {
// 값을 리턴
return division;
}
// 최댓값이 B배열에서 나왔으면
} else {
// A배열을 확인 후 일치하지 않으면
if (!isDivision(arrayA, division)) {
// 값을 리턴
return division;
}
}
}
// 일치하는 값이 없으면 0을 리턴
return 0;
}
📖 풀이 과정
1️⃣ 나는 총 5개의 함수를 활용해서 이번 문제를 풀어봤다. 첫 번째 함수는 최대공약수 함수이다. 유클리드 호제법의 의거하여 a와 b의 최대공약수는 b와 a%b의 최대공약수가 되므로 공식을 활용했다.
2️⃣ 주어진 A와 B 배열에서 최대공약수 찾아야한다. 일단 배열의 첫째 요소를 최대공약수라고 지정한 후 원소를 순회하며 최대공약수를 업데이트한다.
3️⃣ A와 B 배열의 최대공약수 중에 더 큰 값의 약수를 찾아주고 배열에 큰 수에서 작은 수로 넣어준다. 이유는 조건을 만족하는 숫자 중에서 최댓값을 찾아야 하기 때문이다.
4️⃣ 배열의 요소가 위에서 구한 최댓값의 약수로 나눠지는지 확인하는 함수 for of 구문을 활용했다.
5️⃣ 마지막으로 정답을 구하는 함수에서는 A배열과 B배열의 최대공약수를 찾고 그 중에 최댓값을 찾아서 약수를 구하는 함수에 넣어준다.
6️⃣ 약수들을 for of 구문으로 돌면서 약수가 A배열의 최대공약수가 일치하면 B배열을 돌아보고 하나라도 일치하지 않으면 정답이다. 그 반대의 경우도 고려해준다.
7️⃣ 조건을 만족하는 a가 없다면, 0을 return 해라.
✅ 다른 사람 풀이(best)
function solution(arrayA, arrayB) {
// getResult 함수에 A배열과 B배열의 순서를 바꿔서 넣어본다.
let resultA = getResult(arrayA, arrayB);
let resultB = getResult(arrayB, arrayA);
// A의 결과가 크면 A를 리턴 B가 크면 B를 리턴
return resultA > resultB ? resultA : resultB;
}
function getResult(A, B) {
// 처음 파라미터로 들어온 배열을 오름차순으로 정렬한다.
A.sort((a, b) => a - b);
// 배열의 가장 작은 요소를 기준으로 삼고 -1씩 내려간다.
for (let i = A[0]; i > 0; i--) {
// 만약 처음 인자의 배열이 다 나눠지면(약수)이거나 B요소는 하나라도 나눠지지 않으면 i를 리턴한다.
if (A.every(a => a % i === 0) && !B.some(b => b % i === 0)) return i
}
// 조건을 만족하지 않으면 0을 리턴한다.
return 0
}
🤔 나의 생각
👉 다른 사람의 풀이를 보고 놀랬다. 내가 레벨 2의 문제를 너무 어렵게 생각한듯 싶다. 두 배열의 순서만 바꿔서 넣고, 오름차순으로 가장 작은 숫자를 기준으로 삼고 점차 내려가게 설정하며, every(), some() 메서드를 활용하면 우리가 생각하는 답에 접근할 수 있음에도 내가 적절한 메서드를 사용하지 못하고 떠오르지 못했다. 문제를 좀 더 분석하는 능력을 기르고 싶다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] Level2 - 시소 짝꿍(Javascript) (0) | 2023.08.18 |
---|---|
[프로그래머스] Level1 - 달리기 경주(Javascript) (0) | 2023.08.17 |
[프로그래머스] Level2 - 마법의 엘리베이터(Javascript) (0) | 2023.06.08 |
[프로그래머스] Level2 - 호텔 대실(Javascript) (0) | 2023.06.07 |
[프로그래머스] Level2 - 멀쩡한 사각형(Javascript) (0) | 2023.06.05 |