JS 알고리즘 7주차

박규원·2023년 5월 25일
0

JS 알고리즘

목록 보기
6/11

등수 매기기

💡 영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 `score`가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.
function solution(score) {
    var answer = [];
    var avg=[];
    var copy=[];
    
    for (var i=0;i<score.length;i++){
        avg[i]=(score[i][0]+score[i][1])/2;    
    }
    
    
    copy = avg.slice();
    
    avg.sort(function(a,b){
        return b-a;
    });
    
    for(var i=0;i<copy.length;i++){
        for(var j=0;j<avg.length;j++){
           if(copy[i]===avg[j]) answer[i]=avg.indexOf(avg[j])+1;  
        }
    }
    
    return answer;
}

저주의 숫자 3

💡 3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다. ( 표 생략 ) 정수 `n`이 매개변수로 주어질 때, `n`을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.
function solution(n) {
   
    var ary=[];
    var num=1;
    var index=1;
    while(true){
        if(index==101)break;
        if(num%3!=0&&num!=3&&Math.floor(num/10)!=3&&num%10!=3&&Math.floor(num%100/10)!=3){
            ary[index]=num;
            index++;
        }
        num++;
    }
    
    return ary[n];
}

다항식 더하기

💡 한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 `polynomial`이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.
function solution(polynomial) {
    var answer = '';  var ary=[]; var ce=0; var cn=0;
    
    ary=polynomial.split(' ')
    
   for(var i=0;i<ary.length;i++){
        if(ary[i].includes('x')) {
            if(ary[i].split('x').shift()==='') ce+=1;
            else ce+=parseInt(ary[i].split('x').shift());
        }
        else if(ary[i].includes('+')) continue;
        else cn+=parseInt(ary[i]);
   } 
    if(cn==0&&ce!=1)answer=ce.toString()+'x';
    else if(cn==0&&ce==1)answer='x';
    else if(ce==0) answer= cn.toString();
    else if(cn==0&&ce==0)answer="";
    else if(ce!=1)answer=ce.toString()+'x + '+cn.toString();
    else answer='x + '+cn.toString();
    return answer;
}

안전지대

💡 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다. 지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다. 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

매우 비효율적인 코드 완성! ㅋㅋㅋ

function solution(board) {
    var answer = 0;
    var ary=[];
    for (var i=0;i<board.length+2;i++){
        ary.push([]);
        for(var j=0;j<board.length+2;j++){
            ary[i][j]=0;
        }
    }
    
    for(var i=1;i<board.length+1;i++){
        for(var j=1;j<board.length+1;j++){
            ary[i][j]=board[i-1][j-1];
        }
    }
    
    
    for(var i=1;i<board.length+1;i++){
        for(var j=1;j<board.length+1;j++){
            if(ary[i][j]==1){
                ary[i][j-1]=ary[i][j-1]!=1?-1:1; 
                ary[i][j+1]=ary[i][j+1]!=1?-1:1; 
                ary[i-1][j]=ary[i-1][j]!=1?-1:1; 
                ary[i+1][j]=ary[i+1][j]!=1?-1:1;
                ary[i-1][j-1]=ary[i-1][j-1]!=1?-1:1;
                ary[i-1][j+1]=ary[i-1][j+1]!=1?-1:1;
                ary[i+1][j-1]=ary[i+1][j-1]!=1?-1:1;
                ary[i+1][j+1]=ary[i+1][j+1]!=1?-1:1;
            }
        }
    }
    

    for(var i=1;i<board.length+1;i++)
        for(var j=1;j<board.length+1;j++)
            if(ary[i][j]==0) answer++;
    
    
    return answer;
}

겹치는 선분의 길이

💡 선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 `lines`가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/e4122d8b-9ce2-49ce-a360-3d1284babd8a/line_2.png

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

// function solution(lines) {
//     var answer = 0;
    
//     lines.sort((a,b)=>a[0]+a[1]-(b[0]+b[1]));
    
//     for (var i=0;i<2;i++){
//         if((lines[i][1]>lines[i+1][0])&&(lines[i][1]>=lines[i+1][1]))
//             answer+=(lines[i+1][1]-lines[i+1][0]);
//         else if(lines[i][1]>lines[i+1][0])
//              answer+=(lines[i][1]-lines[i+1][0]);
//     }
    
//     if((lines[0][1]>lines[2][0])&&(lines[0][1]>=lines[2][1]))
//             answer-=(lines[2][1]-lines[2][0]);
//     else if(lines[0][1]>lines[2][0])
//             answer-=(lines[0][1]-lines[2][0]);
    
    
//     return answer;
// }

//-값이면 그 값의 절대값을 더한다 즉, 밀어서 대칭이동시켜서 풀어보자
function solution(lines) {
    var answer = 0;
    var ary=[];
    
    //lines.sort((a,b)=>a[0]+a[1]-(b[0]+b[1]));
    
    var mini=Math.min(...lines.flat());
    
    if(mini<0){ //대칭이동
        mini=mini*(-1);
        for(var i=0;i<3;i++){
            lines[i][0]+=mini; lines[i][1]+=mini;
        }
    }
    
    
    for(var i=0;i< Math.max(...lines.flat());i++){
        
        ary[i]=0;
        
    }
    
    for(var i=0;i<3;i++){    
        for(var j=lines[i][0];j<lines[i][1];j++){
            ary[j]+=1;    
        }
    }
    
    for(var i=0;i< Math.max(...lines.flat());i++){
        if(ary[i]>1) {answer++;}
    }
    
    return answer;
 }

이 문제는 반례를 찾지못해서 풀지 못했다. 미쳐버릴거 같지만
반례를 찾아서 꼭 풀어보도록하겠다. 인간승리가 뭔지 보여주지

==> 완성해서 수정완료

profile
Just do IT

0개의 댓글