ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션2
    Algorithm 2022. 2. 3. 13:45

     

    *7개 문제 중 2개 못 풀었음 (22.02.02)

     

     

    1) 큰 수 출력하기

    function solution(arr) {
        let answer = [];
        answer.push(arr[0]); // arr의 0번째 인덱스는 무조건 들어가서 먼저 넣어줌
        for(let i=0; i < arr.length; i++) {
            if(arr[i] < arr[i+1]) {
                answer.push(arr[i+1]);                  
            }
        }
        return answer;
    }
    let arr = [7, 3, 9, 5, 6, 12];
    console.log(solution(arr));

     

     

    2) 보이는 학생

    function solution(arr) {
        let answer = 1;   // 제일 처음에 있는 1명은 보임
        let max = arr[0]; // 제일 처음에 있는 사람의 키 
        for(let i=0; i<arr.length; i++){
            if(arr[i] > max) {
                max = arr[i];
                answer++;
            }                 
        }
        return answer;
    }
    let arr = [130, 135, 148, 140, 145, 150, 150, 153];
    console.log(solution(arr));

    => answer 는 5를 반환

     

     

    *여기서 진짜 기본적인 실수를... if문을 두 줄로 써두고 코드를 줄여보겠다고 중괄호를 안했다. 당연히 조건이 두 줄이니까 코드가 정상적으로 돌아가지 않았다. 창피하지만, 다시는 반복하면 안되니까 기록.

    function solution(arr) {
        let answer = 1;   // 제일 처음에 있는 1명은 보임
        let max = arr[0]; // 제일 처음에 있는 사람의 키 
        for(let i=0; i<arr.length; i++){
            if(arr[i] > max) 
                max = arr[i];
                answer++;                
        }
        return answer;
    }
    let arr = [130, 135, 148, 140, 145, 150, 150, 153];
    console.log(solution(arr));

    => answer 는 9를 반환

     

     

     

     

    3) 가위 바위 보

    function solution(a, b) {
        let answer = "";
        for(let i=0; i < a.length; i++) {
            if(a[i] === 3 && b[i] === 1 || a[i] === 1 && b[i] === 3) {
                if (a[i] > b[i])
                    answer += "B";
                if (a[i] < b[i])
                    answer += "A";
            } else {
                if (a[i] > b[i])
                    answer += "A";
                if (a[i] < b[i])
                    answer += "B";
                if (a[i] === b[i])
                    answer += "D";  
            }
        }
        return answer;
    }
    let a = [2, 3, 3, 1, 3];
    let b = [1, 1, 2, 2, 3];
    console.log(solution(a, b));

     

     

    4) 점수 계산

    function solution(arr) {
        let answer = 0
        let cnt = 0;
        for(let i=0; i < arr.length; i++) {
            if(arr[i] === 0) 
                cnt = 0; 			// 점수가 0일 경우 cnt를 0으로 초기화
            else if(arr[i] === 1) {
                cnt++;
                answer += cnt;
            }
        }
        return answer;
    }
    let arr = [1, 0, 1, 1, 1, 0, 0, 1, 1, 0];
    console.log(solution(arr));

     

     

    5) 등수 구하기

    동점 있을 경우에는 같은 등수로 출력

    ex) const arr = [92, 92, 92, 100, 76] 일 경우 2 2 2 1 5 로 출력

    function solution(arr) {
        let answer = "";
        for(let i = 0; i < arr.length; i++) { // i를 고정시켜두고 
            let cnt = 1;
            for(let j = 0; j < arr.length; j++) { // j를 돌며 비교
                if(arr[j] > arr[i])
                    cnt++;
            }
            answer += cnt + " ";
        }
        return answer;
    }
    
    const arr = [87, 89, 92, 100, 76];
    console.log(solution(arr)); // 4 3 2 1 5

     

    *강사님 코드

    - 나는 출력 결과에 배열 표시가 없길래 문자열로 표시했는데, 그 부분 빼고는 비슷한 로직이다.

    Array.from()으로 arr의 길이인 n 만큼 배열 생성 후 1로 초기화 했던 부분이 인상적이다.

    function solution(arr) {
        let n = arr.length;
        let answer = Array.from({length: n}, () => 1);
        for(let i=0; i<n; i++) {
            for(let j=0; j<n; j++) {
                if(arr[j] > arr[i])
                    answer[i]++;
            }
        }
        return answer;
    }
    
    const arr = [87, 89, 92, 100, 76];
    console.log(solution(arr));

     

     

    6) 격자판 최대합

     

    - 행과 열의 합계 구하기까지 하고, 그 다음은 어떻게 구현해야하나 고민하다가 강의를 보고 이해했다. 

    비슷한 문제를 만났을 때 기억할 수 있도록 그림을 그려왔다.. ㅎㅎ

    격자판 최대합 대각선 풀이

    *강사님 코드

    - 나는 sum을 첫번째 for문 안에 뒀었는데, 강사님은 전역으로 빼고 필요할 때 초기화해서 쓰는 방식으로 구현하셨다.

    Math.max를 이용해서 가장 큰 값을 answer에 담는 것도 생각하지 못했던 방법인데 좋은 것 같다.

    function solution(arr) {
        let answer = Number.MIN_SAFE_INTEGER;
        let n = arr.length;
        let sum1 = sum2 = 0; 
        // 행과 열의 합
        for(let i=0; i<n; i++) {
            sum1 = sum2 = 0; // 행과 열이 바뀌기 전 초기화
            for(let j=0; j<n; j++) {
                sum1 += arr[i][j];
                sum2 += arr[j][i];
            }
            answer = Math.max(answer, sum1, sum2);
        }
        sum1 = sum2 = 0; // 대각선의 합 구하기 전 초기화
        // 대각선의 합
        for(let i=0; i<n; i++) {
            sum1 += arr[i][i];
            sum2 += arr[i][n-i-1];
        }
        answer = Math.max(answer, sum1, sum2);
        return answer;
    }
    
    let arr = [[10, 13, 10, 12, 15], 
    [12, 39, 30, 23, 11], 
    [11, 25, 50, 53, 15], 
    [19, 27, 29, 37, 27], 
    [19, 13, 30, 13, 19]]; 
    console.log(solution(arr));

     

     

     

    7) 봉우리

     

    👉한 바퀴 돌고 와서 다시 풀기

     

     

    *강사님 코드

    function solution(arr) {
        let answer = 0; // 카운팅
        let n = arr.length;
        let dx = [-1, 0, 1, 0]; // 행 증감
        let dy = [0, 1, 0, -1]; // 열 증감
    
        for(let i=0; i<n; i++) {
            for(let j=0; j<n; j++) {
                let flag=1; // 봉우리 여부 판단
                for(let k=0; k<4; k++) {// 상하좌우 비교
                    let nx=i+dx[k]; // 행 좌표
                    let ny=j+dy[k]; // 열 좌표
                    if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]) { // 봉우리 판단, 인덱스 범위(- 불가): nx>=0 && nx<n && ny>=0 && ny<n
                        flag = 0; // 봉우리가 아닐 경우 
                        break; // 크거나 같은 수 발견 시 반복할 필요 없으니까 
                    }                        
                }
                if (flag)
                    answer++;   
            }
        }
        return answer;
    }
    
    let arr = [[5, 3, 7, 2, 3],
    [3, 7, 1, 6, 1],
    [7, 2, 5, 3, 4],
    [4, 3, 6, 4, 1],
    [8, 7, 3, 5, 2]];
    console.log(solution(arr));

     

     

    댓글

Designed by Tistory.