728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42747

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

 

코드


function solution(citations) {
    let answer = 0;
    citations.sort((a, b) => (b - a)); //내림차순 정렬
    //i는 인용횟수, citations[i]는 각 인용횟수별 논문개수
    for (let i=0; i<citations.length; i++) {
        if (i < citations[i]) answer++; //인용횟수가 논문개수보다 작을때까지는 계속해서 +1 해주기 (최대값을 구하는 거니까)
    }
    return answer;
}

 

후기


  • 많은 분들의 후기를 보니 나처럼 문제 이해에 골머리 앓는 분들이 많은 것 같았다
  • 처음에는 주어진 테스트케이스의 해설을 보며 생각보다 쉽군 하며 접근해 보았는데 완전 큰코 다쳤다. 주어지는 배열을 오름차순 정렬하고 중간값을 찾아서 중간값 이후의 숫자들이 중간값크기보다 크냐 작냐에 따라 중간값을 이동하며 값을 return 하려고 했는데, 하면 할수록 함정에 빠진 것마냥 하드코딩이 되어가고 답이 안나오는 상황을 겪었다
  • 결국 다른 분의 풀이를 참고하였는데, 이 문제를 제대로 이해하기 위해서는 다음 사이트를 참고하는 것이 정말 큰 도움이 되었다 (문제 이해가 안되시는 분들은 꼭 보시길 바란다!)
  • https://www.ibric.org/myboard/read.php?Board=news&id=270333 
  • 사이트를 이해하고 나니 코드가 너무 간결해서 민망할 지경이었다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42587?language=javascript 

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

코드


function solution(priorities, location) {
    let max;
    let count = 0;

    while(true) {
        max = Math.max(...priorities); //우선순위가 제일 높은 수 저장
        let first = priorities.shift(); //우선순위 배열의 제일 앞 요소를 빼내기

        if (first !== max) priorities.push(first); //제일 앞 요소가 max값이 아니면 push를 통해 우선순위 배열의 제일 마지막으로 보내기
        else { //제일 앞 요소가 max값이면
            count++; //내가 찾는게 몇 번째로 출력되는지 반환하기 위해 +1씩 해주기
            if (location === 0) return count; //위의 과정을 반복하다가 내가 찾는 것이 제일 앞 요소가 되었을때, 계속 +1 해오던 count 반환
        }
        location--; //내가 찾는 요소가 제일 앞 요소가 될 때까지 location 줄여나가기

        if (location === -1) location = priorities.length - 1; //location을 줄여나가다가 idx가 0보다 작아지게 되면 배열의 가장 끝 idx로 보내기
    }
}

 

후기


  • 우선 이 문제는 처음에 제시된 배열의 순서를 지켜야 하기 때문에 정렬을 해서는 안된다. 어떻게 순서를 유지하며 max값을 찾고, 내가 원하는 요소의 위치를 찾을 수 있을까 고민하다가 스택/큐 문제답게 자바스크립트에서 제공하는 shift(), push() 함수를 적절하게 사용하면 나름 쉽게 풀 수 있는 문제였다
  • 이 문제를 통해 알게된 건 자바스크립트의 배열 내 최대값, 최소값 찾는 법으로 Math.min(), Math.max() 함수를 사용한다는 것이다
  • 사용법 : Math.max.apply(null, 배열이름) or Math.max(...배열이름) >> 두가지 방법으로 사용가능하다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42885?language=javascript 

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

 

코드


function solution(people, limit) {
    let boat = 0;
    let left = 0; //무게 배열에서 제일 큰 무게
    let right = people.length - 1; //무게 배열에서 제일 작은 무게

    people.sort((a,b)=>(b-a)); //무게 순으로 내림차순하고
    while (left < right) {
        if (people[left] + people[right] > limit) left++; //제일 큰 무게 + 제일 작은 무게 > limit 이면 두 명이 같이 보트에 못 탄다는 의미니까 다음 진행을 위해 left++시키고 boat++ 해주기
        else { //limit보다 같거나 작으면 같이 보트에 탈 수 있는 거니까 다음 진행을 위해 left++, right-- 진행 해주고 boat++ 해주기
            left++;
            right--;
        }
        boat++;
    }
    if (left == right) boat++; //마지막으로 남아있는 사람이 있다면 마지막으로 그 사람을 태우기 위한 boat++ 해주기
    return boat;
}

 

후기


  • 문제 이해 : 한 구명보트에는 최대 2명이 탈 수 있고, limit을 넘으면 안 된다. (limit까지는 가능) 모든 사람을 다 태우기 위해 필요한 최소한의 구명 보트 개수를 return 하라
  • 다른 분의 풀이를 조금 참고했는데, 그리디 문제인데 마치 퀵 정렬처럼 left, right를 조절하여 중간으로 만나게 하는 방식이 인상적이었고 그리디 문제를 풀이할 때 이런 방법으로도 풀이할 수 있구나를 배웠다!
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12941?language=javascript 

 

코딩테스트 연습 - 최솟값 만들기

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱

programmers.co.kr

 

코드


function solution(A,B){
    let acc = 0;
    A = A.sort((a,b)=>(a-b)); //1 2 4 배열 하나는 오름차순 정렬
    B = B.sort((a,b)=>(b-a)); //4 4 5 나머지 하나는 내림차순 정렬
    for (let i=0; i<A.length; i++) {
        acc += A[i]*B[i]; //각 index별 숫자들을 곱한 값을 누적
    }
    return acc;
}

 

후기


  • 규칙만 찾으면 쉽게 풀 수 있는 Level2 문제였다!
  • 마지막 for문은 reduce() 함수를 이용했으면 더 좋았겠다

+ Recent posts