N,K=map(int,input().split())
num_input=list(map(int,input().split())) #list에 n개의 자료를 띄어쓰기로 입력받을 때 문법
add_lst=[]
for i in range(N-1): # (x) 인덱스가 0번부터 도니까, N이 맞다.
for j in range(1,N-1): # (x) 여기서 1로 고정해버리면 안된다. 시작점은 i보다 하나 앞
for k in range(2,N-1): # (x) 여기서도 2로 고정해버리면 안된다.
if(add_lst.count(num_input[i]+num_input[j]+num_input[k])) ==0:
add_lst.append(num_input[i]+num_input[j]+num_input[k])
# 중복되는 값을 빼기 위해, 가장 내부의 for문에서 if조건문을 통해, 값이 없을 때만 추가하도록 했음
add_lst.sort()
cnt=0
print(add_lst[K-1])
<내가 생각한 알고리즘>
가지고 있는 N장의 카드 중 3장을 뽑아서 더한 값을 모두 기록한다.
이 중, K번째로 큰 수를 출력해야 한다.
1. 3장을 뽑아서 더할 때, 같은 결과가 나올 수 있다.
2. 단, K번째로 큰 수를 출력해야하기 때문에, K를 셀 때는 중복되는 케이스는 무시하고 세야한다
3. 먼저, N과K를 입력받는다 / N의 갯수만큼 숫자를 입력받는다/ 앞부터 순차적으로 값을 3개씩 더하고, 그걸 기록하자
/ 기록할 때 중복되는 경우는 빼자(?) / 합의 결과들이 담긴 곳에서, k번째를 찾자.
<결과>
실행은 됐지만, 다른 출력값 (37)이 나왔다
3. 정답
N,K=map(int,input().split())
num_input=list(map(int,input().split())) #list에 n개의 자료를 띄어쓰기로 입력받을 때 문법
res=set() # 중복을 방지하기 위한 작업
for i in range(N):
for j in range(i+1,N):
for m in range(j+1,N):
res.add(num_input[i]+num_input[j]+num_input[m])
res=list(res) #list가 아닌 것을 list로 변환한다(sort함수 사용하기 위해)
res.sort(reverse=True) #sort를 내림차순으로 하는 방법
print(res[K-1])
4. 반성점
3중 for문을 쓸 생각을 못했다.
sort함수는 기본적으로, 오름차순이다. k번째 큰수면 내림차순으로 정렬하는 방식을 추가했어야 했다.
5. 잘한 점
sort기능을 생각해서 꺼내썼다!! 예전에 백준알고리즘에서 혼자 쌩쇼했던 시행착오 떠올렸다
6. 새로 알게된 내용
set()
: 중복되는 값 피하고 싶을 때, set자료구조 쓴다!!
--> 내가 if문을 통해 중복을 피하려고 했지만, 더 간단하게 함수를 통해 중복을 해결할 수 있다
--> res=set() 코드를 추가하면, res에 어떤 자료를 넣으면 저절로 중복이 처리된다
set이라는 자료구조에는, sort기능이 없다.
sort는 기본적으로 리스트에서 구현된다. 따라서, ****res를 다시 list로 바꾸는 작업 필요했다!!
3중 for문을 통해, 차례대로 숫자 3개를 합하는 것을 구할 수 있었다. 중복을 방지하기 위해서, 3중 for문을 사용했고 그 때 range를 조심하자