이안의 평일코딩

[JS] 완전탐색 (브루트포스) 본문

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>
반응형
Comments