본문 바로가기
코딩/백준

백준 20300번 서강근육맨 반례 + 파이썬 코드 + 풀이

by 큰고양2 2023. 11. 9.

https://www.acmicpc.net/problem/20300

 

20300번: 서강근육맨

PT 첫째 날에 $1$과 $4$를 선택하고, 둘째 날에 $2$와 $3$을 선택하고, 마지막 날에 $5$를 선택하면 $M$은 $5$가 되며, 이때가 $M$이 최소일 때이다.

www.acmicpc.net

 

 

이 문제는 반례가 하나밖에 없어서 테스트 하기가 어렵다

대충 만든 반례를 추가하자면

 10
 20 50 51 52 53 60 100 90 1000 60

 

1020

 1
 1
1

 4
 1 40 41 42
81

 5
 1 20 50 70 71
71

 

정도가 되겠다

 

 


풀이 코드

#정렬을 하고 1부터 n//2 까지 앞부터, 뒤부터 값을 더하고 가장 큰 숫자

n = int(input())
m = list(map(lambda x:int(x), input().split()))
m.sort() #정렬 

if n == 1 : # n이 1이면 그대로 출력
    print(m[0])
elif n % 2 == 0 : #n이 홀수인 경우
    tmp = 0
    for i in range(0,n//2) : #n//2까지 합 중 가장 큰 숫자
        k = m[i] + m[-i-1]
        if tmp < k :
            tmp = k
    print(tmp)
else :
    tmp = 0
    for i in range(0,(n-1)//2) : #맨 마지막 제외 n//2까지의 합 중 가장 큰 숫자
        k = m[i] + m[-i-2]
        if tmp < k :
            tmp = k
    print(max(tmp,m[-1])) # 마지막 숫자와 합을 비교해서 더 큰 숫자 출력

 

 

문제 풀이는 어렵지 않다

먼저 숫자를 정렬 한 이후

짝수의 경우

시작과 끝부터의 i 번째 숫자를 n//2 번까지 하나씩 더해서 가장 큰 숫자를 구해 출력하면 되고

홀수의 경우

시작부터 i 번째 숫자와 끝부터 i+1 번째 숫자를 n//2 번까지 더해서 가장 큰 숫자를 구하고 해당 숫자를 맨 마지막 숫자와 비교해서 더 큰 숫자를 출력하면 된다