파이썬 알고리즘 003 | K번째 큰 수

Yunny.Log ·2021년 1월 5일
0

Algorithm

목록 보기
3/318
post-thumbnail

3. 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

'같은 숫자의 카드가 여러장 있을 수 있습니다.' 같이 중복이슈가 있는 경우, 문제 해석에 집중해야 하는 문제입니다. 실수가 많을 수 있습니다.

또한 '만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값 은 22입니다.'이 예시의 해석도 중요합니다. 'K값이 3이라면 K번째 큰 값 은 22'이 되려면 같은 합 결과의 경우는 다른 번째라고 간주하지 않습니다.

<내 풀이>

sums=[]
n, k = map(int, input().split())
num=sorted(list(map(int, input().split())))

for i in range(n-2):
    for x in range(1,n-1):
        for y in range(2,n):
            a=(num[i]+num[x]+num[y])
            sums.append(a)
sums=set(sums)
sums=list(sums)
sums.sort(reverse=True)
print(sums[k-1])

내 사고의 오류 :
for 3개 구문의 range 정할 때 x랑 y가 시작하는 기준을 1,2로 잡아놨었는데
얘네는 둘다 앞에의 애들보다 (각 i, x) 1더 큰 것부터 시작해야하는거니깐..!

1,2 가 아닌 i+1 , x+1 !!!

그리고 선생님과 나의 풀이에 다른 점이 있다면 나는 처음에 리스트 만들었다가 사전으로 바꿨다가 다시 리스트로 바꿨구!
선생님은 사전으로 시작해서 나중에 리스트로 바꿨다는 것~!

어찌저찌 수정한 끝에

sums=[]
n, k = map(int, input().split())
num=sorted(list(map(int, input().split())))

for i in range(n-2):
    for x in range(i+1,n-1):
        for y in range(x+1,n):
            a=(num[i]+num[x]+num[y])
            sums.append(a)
sums=set(sums)
sums=list(sums)
sums.sort(reverse=True)
print(sums[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])

<반성점>

내 사고의 오류 :
for 3개 구문의 range 정할 때 x랑 y가 시작하는 기준을 1,2로 잡아놨었는데얘네는 둘다 앞에의 애들보다 (각 i, x) 1더 큰 것부터 시작해야하는거니깐..!

1,2 가 아닌 i+1 , x+1 !!!

<배운 점>

  • set
    : 중복 없음, 리스트를 중복 없게 하고 싶으면 얘를 사용하자
    리스트 안 요소들이 중복 없게 하기 위해서는
    얘를 set로 변경해주었다가 다시 list로 변경을 해주면 중복된 부분들은 제거가 되고 다시 리스트로 돌아오면 중복 없는 리스트가 생성이 된다!

  • map(int, input.split())

13 3 4
=> 이렇게 숫자 받는 형식에는 무조건 얘로 받으면 된다

0개의 댓글