언어

정렬

땅호720 2023. 12. 21. 21:10

1. K번째 수 lv.1

배열 array의 i번째부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수 구하기

[매개변수]

  • 배열 array
  • [i, j, k]를 원소로 가진 2차원 배열 commands

[제한사항]

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.
def solution(array, commands):
    answer = []
    
    for i,j,k in commands:
        answer.append(sorted(array[i-1:j])[k-1])
    
    return answer

 

 

한 줄로 표현한 코드는 아래와 같다.

def solution(array, commands):
    return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))

 

해석하자면 commands (i,j,k)를 sorted(array[i-1:j])[k-1]에 매핑시켜서 List 형태로 반환한 코드이다.

두 코드는 구조와 성능 모두 비슷하다.

 

 

 

2. 가장 큰 수 lv.2

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers의 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return.

[제한 사항]

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
def solution(numbers):
    answer = ''
    
    numbers=list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)  # 내림차순, 원소가 1000이하이므로 최소 3자릿수로 만들어줌 (일의 자리 수), 1000일 경우 어차피 100,010,001,000
    answer = answer.join(numbers)
    
    return answer

 

str형으로 변환해주어 이어주는 구조.

numbers 배열 내 원소가 1000 이하이므로 최소한 3자릿수를 만들어주기 위해 3번 이어준다. (일의 자리 수일 경우)

이렇게 되면 문자열 내림차순 정렬을 해주면서 왼쪽부터 3번째 숫자까지 정렬되는 결과를 얻을 수 있다. (ex: '666', '222', '101010')

 

 

 

 

3. H-Index lv.2

H-Index는 과학자의 생산성과 영향력을 나타내는 지표.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return.

[제한 사항]

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
def solution(citations):
    citations.sort(reverse=True)
    answer = max(map(min, enumerate(citations, start=1)))
    return answer

논문 인용 횟수를 내림차순 정렬

논문 개수(i)와 논문 인용 횟수(c) 중 작은 값을 선택하고 그 중에서 max값으로 h-index를 구하는 방법

 

def solution(citations):
    citations = sorted(citations)
    l = len(citations)
    for i in range(l):
        if citations[i] >= l-i:
            return l-i
    return 0

논문 인용 횟수를 오름차순 정렬

현재 논문의 인용 횟수가 남은 논문 수보다 크거나 같으면 h-index는 남은 논문 수와 같다.