Algorithm

221024 :: [프로그래머스] 문자열 내 마음대로 정렬하기, 멀리 뛰기, H-Index

kohi ☕ 2022. 10. 25. 00:32
문자열 내 마음대로 정렬하기
👾 문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

👾 제한 사항
  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

 

👾 나의 답안

function solution(strings, n) {
    strings.sort((a, b) => {
        return a[n] === b[n] ? (a > b) - (a < b) : (a[n] > b[n]) - (a[n] < b[n]);
    });
    return strings;
}

 

  • 각 인덱스 n에 해당하는 값을 비교해서 둘이 같으면 (a > b) - (a - b) 반환, 숫자 정렬처럼 사용할 경우 정상적으로 정렬되지 않는다. 처음에 그냥 a - b로 작성했다가 몇 번 틀렸다. (https://developer-talk.tistory.com/73 참고)
  • 그렇지 않으면 (a[n] > b[n]) - (a[n] < b[n]) 반환

 

👾 다른 사람의 풀이

function solution(strings, n) {
    // strings 배열
    // n 번째 문자열 비교
    return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

 

localeCompare()

'a'.localeCompare('b') 
  • a가 b보다 앞에 있으면 -1, 같으면 0, 뒤에 있으면 1 반환

 

멀리 뛰기
👾 문제 설명
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다.

👾 제한 사항
n은 1 이상, 2000 이하인 정수입니다.

 

피보나치 수열 단어가 안 떠올라서 이렇게 검색했는데 나옴

 

 

👾 나의 답안

function solution(n) {
    function fibonacci(n) {
        if (n <= 2) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
    return fibonacci(n) % 1234567;
}

 

  • 첫 답안, 시간 초과 뜸

 

function solution(n) {
    const arr = [0, 1, 2, ...Array(n - 2).fill(0)];
    arr.forEach((_, i) => {
        if (i > 2) arr[i] = (arr[i - 1] + arr[i - 2]) % 1234567;
        else arr[i] = i;
    });
    return arr[n];
}

 

 

아 ㅡㅡ

 

function solution(n) {
    const dp = [0, 1, 2];
    if (n <= 2) return dp[n];

    for (let i = 3; i <= n; i++) {
        dp[i] = (dp[i - 1] + dp[i - 2]) % 1234567;
    }
    return dp[n];
}

 

  • 테스트 케이스 전부 통과한 답안, 배열 dp에 0, 1, 2 넣어주고 n이 2보다 작거나 같으면 해당 값 바로 반환
  • forEach 문으로 작성했던 코드는 for 문으로 돌려서 i를 3으로 초기화하고 피보나치 수열 구현
  • 효진아 날도 추운데 멀리 뛰기 연습 같은 거 하지 말고 어지간하면 그냥 집에 있어라

 

H-Index
👾 문제 설명
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

👾 제한 사항
  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

 

💬 참고

https://en.wikipedia.org/wiki/H-index

 

h-index - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Metric that attempts to measure the productivity and citation impact of a person's publications The h-index is an author-level metric that measures both the productivity and citation i

en.wikipedia.org

https://khuelibrary.tistory.com/107

 

h-index ?

h-index는 연구자의 연구 성과를 평가하기 위한 지표로서 물리학자인 Jorge E. Hirsch가 제안하였습니다. Hirsch Index, Hirsch number등으로 불리기도 합니다. 연구자의 연구성과는 "몇 편의 논문을 썼느냐"

khuelibrary.tistory.com

h-index는 쉽게 산출할 수 있습니다. 그림과 같이 연구자의 전체 논문을 피인용 순으로 정렬한 후, 논문의 순번과 피인용 횟수를 비교하여 피인용 횟수가 논문의 순번보다 작아지기 시작하는 직전의 순번이 연구자의 h-index가 됩니다. 
출처: https://khuelibrary.tistory.com/107 [경희대학교 공학도서관:티스토리]

 

👾 나의 답안

function solution(citations) {
    citations.sort(function (a, b) {
        return b - a;
    });

    let i = 0;
    while (i < citations[i]) {
        i++;
    }
    return i;
}

 

  • 문제가 좀 혼미한데 H-index 구하는 법만 알면 간단하게 구현 가능하다
  • 내림차 순으로 정렬한 뒤 인덱스보다 인용 횟수가 큰 값을 가지는 동안 인덱스에 1씩 더해나가고, while문을 빠져나갈 때 i 값 반환