[알고리즘]K번째 큰 수

김도연·2024년 1월 1일

알고리즘

목록 보기
3/56

문제

현수는 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=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])

*a=list(map(int,input().split())) : 리스트의 값을 입력 받을 때 쓰는 형식!

*3개의 수를 뽑았을 때 중복 될 수 있음->중복제거->set() {중복 제거 자료구조}

*set은 sort가 없다.

3중 for문 알고리즘

[나의 코드]

[미완성]
def plus(list):
sum=0
for i in list:
	sum+=list[i]
return sum

def factorial(n):
return n*factorial(n-1)

def combination(n,r,ans):

result=[]
if n==r:
	return result.append(1)
else :
	result.append

N,K=map(int,input().split())
a=list[K]
for i in range (1,N+1):
	a.append(map(int,input().split()))

# 조합을 사용하자 10C3

*조합함수를 구현하여 조합을 통해 숫자를 뽑고 리스트에 삽입해야 겠다고 생각.

*뽑은 각각의 3개의 숫자를 더하는 함수 구현.

<문제점> 비교적 쉬운 알고리즘에도 어렵게 구현을 생각함. 조합말고 다른 방법 구현에 대해 생각하지 못함.

0개의 댓글