반응형
[문제] 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
문제 접근
- N과 K를 입력받는다.
- N에서 3장을 선택할 수 있는 모든 경우의 수를 뽑고 더해서 다른 리스트에 담아준다.
- 모든 경우의 수가 들어있는 리스트를 set()으로 중복 제거를 해준다.
- 중복 제거된 리스트를 가장 큰수부터 작은 수를 배열하기 위해 내림차순 정렬을 해준다.
- 결과 리스트에서 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])
반응형
'코딩테스트 > Algorithm' 카테고리의 다른 글
[Algorithm][Python] 곶감(모래시계) (1) | 2021.05.20 |
---|---|
[Algorithm][Python] 자릿수의 합 (0) | 2021.05.19 |
[Algorithm][Python] 정다면체 (0) | 2021.05.13 |
[Algorithm][Python] 대표값 (0) | 2021.05.13 |
[Algorithm][Python] K번째 작은수 (0) | 2021.05.13 |
[Algorithm][Python] K번째 약수 (0) | 2021.05.13 |