[algorithms] k번째 큰 수

Hyeseong·2022년 2월 15일
0

algorithms

목록 보기
3/5
"""
K번째 큰 수

현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 
같은 숫자의 카드가 여러장 있을 수 있습니다.
현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려고 합니다. 
3장을 뽑을 수 있는 모든 경우를 기록합니다. 
기록한 값 중 K번째로 큰 수를 출력하는 프로그램을 작성하세요.

- 입력 설명
첫 줄에 자연수 N(3<=N<=100), K(1<=K<=50)가 입력되며 그 다음 줄에 N개의 카드 값이 입력된다. 

- 출력 설명
첫 줄에 K번째 수를 출력합니다. K번째 수는 반드시 존재합니다.

- 입력예제 1
10 3
13 15 34 23 45 65 33 11 26 42

- 출력예제 1
143

"""

solution = []

n, k = map(int, input().split())

if not (3<=n<=100) or not (1<=k<=50):
    print(f"Scope of N and K Should be (3<=N<=100) and (1<=K<=50)")

def big_k(n, k):
    import random 
    random_numbers = [random.randint(1, 101) for _ in range(n)]
    print(random_numbers)
    for a in range(n):
        for b in range(a+1, n):
            for c in range(b+1, n):
                print(random_numbers[a]+random_numbers[b]+random_numbers[c], ':', random_numbers[a], random_numbers[b], random_numbers[c])
                solution.append(random_numbers[a]+random_numbers[b]+random_numbers[c])
    
    # 내림차순 정렬
    result = sorted(solution, reverse=True)
    print(result)
    # k번째로 큰 수 
    return result[k-1]
print(big_k(n, k))    

다른 풀이 - 1

  n, k = map(int, input().split())
  a = list(map(int, input().split()))
  res = set()
  for i in range(n):
      for j in range(i+1,n):
          for m in range(j+1, n): # 중복 방지
              res.add(a[i]+a[j]+a[m])
  res = list(res)
  res.sort(reverse=True)
  print(res[k-1])

다른 풀이 - 2

import random
from itertools import combinations

def solution(n,k):
    n, k = map(int,input().split())
    n_list = [random.randint(1, 100) for _ in range(n)]
    answer = set() # 중복 제거
    for i in list(combinations(n_list,3)):
        answer.append(sum(i))
        answer.sort(reverse=True)
    return answer[k-1]
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글

관련 채용 정보