🖋️ 완전탐색 알고리즘 풀이
최소직사각형
- 명함은 가로/세로 회전 가능
작아서 들고 다니기 편한 지갑을 만들기
- 모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes
- 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return
function solution(sizes) {
const [min, max] = sizes.reduce(([min, max], [a, b])
=> [Math.max(Math.min(a, b), min)
, Math.max(Math.max(a, b), max)]
, [0, 0])
return min * max;
}
모의고사
- 삼인방은 모의고사에 수학 문제를 전부 찍기
가장 많은 문제를 맞힌 사람이 누구
1번 수포자가 찍는 방식: [1, 2, 3, 4, 5]
2번 수포자가 찍는 방식: [2, 1, 2, 3, 2, 4, 2, 5]
3번 수포자가 찍는 방식: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
- 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers
- 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return
function solution(answers) {
const patterns = [
[1,2,3,4,5],
[2,1,2,3,2,4,2,5],
[3,3,1,1,2,2,4,4,5,5]
]
let max = 0;
const result = patterns.map((p) => {
const arr = answers.filter((v, i) => v === p[i % p.length]);
max = Math.max(max, arr.length);
return arr.length;
});
return result.map((v, i) => v === max ? i+1 : -1).filter((v) => v >= 0);
}
소수 찾기
- 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers
- 종이 조각으로 만들 수 있는 소수가 몇 개인지 return
function solution(numbers) {
return getCombi(numbers).filter(v => isPrime(v)).length;
}
const getCombi = (str) => {
const answer = [];
const visited = Array.from({ length: str.length }, () => true);
const dfs = (cur) => {
answer.push(+cur);
for (let i = 0; i < str.length; i++) {
if (visited[i]) {
visited[i] = false;
dfs(cur + str[i]);
visited[i] = true;
}
}
}
dfs('');
return [...new Set(answer)];
}
const isPrime = (n) => {
if (n <= 1) return false;
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false;
}
}
return true;
}