본문 바로가기
Algorithm

[인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션2

by Baest 2022. 2. 3.

 

*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));