Study/JS Algorithm Rocket
[JS] 완전탐색 (브루트포스)
이안92
2021. 5. 26. 17:45
반응형
자리수의 합
<script>
function solution(n, arr){
let answer, max=Number.MIN_SAFE_INTEGER;
for(let x of arr){
// 첫번째 방법
let sum=0, tmp=x; // tmp는 임시변수
// tmp 128 12 1 0될때까지 => tmp%10 8 2 1
while(tmp){
sum+=(tmp%10);
tmp=Math.floor(tmp/10);
}
console.log(sum); // 11 10 9 4 8 11 6
// 두번째 방법
let sum=x.toString().split('').reduce((a, b)=>a+Number(b), 0); // Number화 해줘야함, 0으로 초기화
// (3) ["1", "2", "0"], ....
console.log(sum); // 11 10 9 4 8 11 6
if(sum>max){
max=sum;
answer=x;
}
else if(sum===max){
if(x>answer) answer=x;
}
}
return answer;
}
let arr=[128, 460, 603, 40, 521, 137, 123];
console.log(solution(7, arr));
</script>
뒤집은 소수
Math.sqrt()는 제곱근을 찾아준다. Math.sqrt(9); // 3
<script>
function isPrime(num){
if(num===1) return false; // i<=num나 i<=num/2로 해도 되지만 더 많이 계산 해야됨
for(let i=2; i<=parseInt(Math.sqrt(num)); i++){ // 16이면 1x16, 2x8, 4x4 제곱근까지 보면됨
if(num%i===0) return false; // i가 약수이므로 num%i이 0이면 소수가 아니게 된다
}
return true;
}
function solution(arr){
let answer=[];
// 첫번째 방법
for(let x of arr){
let res=0; // res는 result
while(x){
let t=x%10; // 1의 자리 예를들어 307이면 307 30 3 0 => 7 70 703
res=res*10+t;
x=parseInt(x/10);
}
if(isPrime(res)) answer.push(res); // res가 소수이면 answer에 push해줌
}
// 두번째 방법
for(let x of arr){
let res=Number(x.toString().split('').reverse().join('')); // 숫자 반대로 됨
if(isPrime(res)) answer.push(res);
}
return answer;
}
let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
console.log(solution(arr));
</script>
멘토링
<script>
function solution(test){
let answer=0; tem=[];
m=test.length; // 행 크기, 테스트 횟수
n=test[0].length; // 학생 수
for(let i=1; i<=n; i++){ // 1~4번 학생 i는 멘토가 되는 학생의 번호
for(let j=1; j<=n; j++){ // 1~4번 학생 j는 멘티가 되는 학생의 번호
console.log(i, j); // 1 1, 1 2, .... 4 3, 4 4
let cnt=0; // 매 테스트 들어가기 전 0으로 초기화
for(let k=0; k<m; k++){ // 0~m-1번째테스트 k는 수학테스트 번호
let pi=pj=0;
for(let s=0; s<n; s++){ // 0~n-1등까지 s는 각 테스트에서의 등수
if(test[k][s]===i) pi=s; // i번 멘토학생이 있다면 등수는 s
if(test[k][s]===j) pj=s; // j번 멘티학생이 있다면 등수는 s
}
if(pi<pj) cnt++;
}
// 테스트횟수와 cnt++된 횟수가 같으면 pi 등수가 모든 테스트에서 높았던 것이 됨
if(cnt===m) {
tmp.push([i, j]);
answer++;
}
}
}
console.log(tmp); // [3, 1] [3, 2] [4, 1]
return answer;
}
// [3,4,1,2]는 3번 학생이 1등, 4번 학생이 2등,...
let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
console.log(solution(arr));
</script>
졸업선물
<script>
function solution(m, product){
let answer=0;
let n=product.length; // 학생수
// arr.sort(function(a,b) {return a-b;}); 오름차순 정렬, b-a면 내림차순 정렬
product.sort((a, b)=>(a[0]+a[1])-(b[0]+b[1])); //(상품가격+배송비)-(상품가격+배송비)
console.log(product); // 총비용으로 정렬됨 [2, 2] [4, 3]... [10, 3]
for(let i=0; i<n; i++){
let money=m-(product[i][0]/2+product[i][1]); // 남은금액 money에 상품/2 + 배송비
let cnt=1;
for(let j=0; j<n; j++){
// i는 할인된 상품이므로 같지않아야함
if(j!==i && (product[j][0]+product[j][1])>money) break; // 멈춰주지 않으면 계속 돔
// 상품+배송비 남은예산보다 작거나 같아야함
if(j!==i && (product[j][0]+product[j][1])<=money){
money-=(product[j][0]+product[j][1]); // 살수있으므로 예산money에서 빼줌
cnt++;
}
}
answer=Math.max(answer, cnt); // 최대개수 answer와 cnt중 큰 것
}
return answer;
}
// [상품가격, 배송비]
let arr=[[6, 6], [2, 2], [4, 3], [4, 5], [10, 3]];
console.log(solution(28, arr)); // 예산, 상품정보
</script>
K번째 큰 수
<script>
function solution(n, k, card){
let answer;
let tmp = new Set(); // 객체 생성 호출
for(let i=0; i<n; i++){
for(let j=i+1; j<n; j++){
for(let k=j+1; k<n; k++){ // scope가 for문안에서만 존재하므로 k써도됨
tmp.add(card[i]+card[j]+card[k]);
}
}
}
console.log(tmp); //72개 순서없음
let a=Array.from(tmp).sort((a, b)=>b-a); // b-a는 내림차순
console.log(a); //72개 내림차순. 152 144 143 ....
answer=a[k-1]; // a[3-1]; a[2] 는 143
return answer;
}
let arr=[13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
console.log(solution(10, 3, arr)); // 10장의카드, 세번째
</script>
반응형