본문 바로가기
코딩테스트/Algorithm

[Algorithm][Python] K번째 큰 수

by codeok 2021. 5. 13.
반응형

[문제]  K번째 큰 수

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

 

입력 설명

첫 줄에 자연수 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

 

문제 접근

  1. N과 K를 입력받는다.
  2. N에서 3장을 선택할 수 있는 모든 경우의 수를 뽑고 더해서 다른 리스트에 담아준다.
  3. 모든 경우의 수가 들어있는 리스트를 set()으로 중복 제거를 해준다.
  4. 중복 제거된 리스트를 가장 큰수부터 작은 수를 배열하기 위해 내림차순 정렬을 해준다.
  5. 결과 리스트에서 k번째의 값을 출력해준다.

 

풀이

 

나의 코드

from itertools import combinations

N, K = map(int, input().split())
result = []

card = list(map(int, input().split()))

# itertools의 combinations를 이용해서 3개를 선택할 수 있는 모든 경우의 수를
# 리스트로 감사서 picked_card 변수에 담아줍니다.
picked_card = list(combinations(card,3))

# 3개 숫자를 선택한 모든 경우의 수의 리스트를 
# for문을 돌려서 인덱싱으로 3개를 더해서 result에 appned()로 더해줍니다.
for p_c in picked_card:
    result.append(p_c[0] + p_c[1] + p_c[2])

# set함수를 통해서 result의 중복을 제거 후 
# sorted()의 reverse=True로 내림차순 정렬(큰 값 => 작은 값)
result = sorted(set(result), reverse=True)

print(result[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):
            # set은 중복된 값이 들어가지지 않고, add()로 더한다.
            res.add(a[i]+a[j]+a[m])

res = list(res)
res.sort(reverse=True)

print(res[k-1])

 

반응형