티스토리 뷰
1. 처음 생각한 코드
#그리디_큰 수의 법칙
n,m,k = map(int, input().split())
num = list(map(int, input().split()))
num.sort() #리스트에 있는 수들 오름차순으로 정렬
sum =0
i =0
first = num[n-1] #가장 큰 수 저장
second = num[n-2] #두번째로 큰 수 저장
while i<m: #인덱스가 주어진 m보다 작을 경우 연산 시작
sum+=first*k #sum = first를 k번 더함
i+=k #인덱스는 k만큼 증가(k번 더했으니까)
if i<m: #인덱스 다시 비교(k<=m이므로)
sum+=second #인덱스가 m보다 작으면 sum에 그 다음 큰 수 한번 더함
i+=1 #인덱스 하나 증가(두번째 큰 수 한번 더했으므로)
else: #인덱스가 m이상일 경우
i = i-m #위에서 구한 인덱스에 m을 뺌
sum = sum- (first*i) #sum에서 넘친 만큼 뺌
break #while반복문 나감
print(sum)
#한줄평: m-=1를 생각못해서 조금 더 복잡하게 푼거 같다..
2. 모범 답안 참고
#그리디 큰수법칙 모범 답안
n,m,k = map(int, input().split())
num = list(map(int, input().split()))
sum = 0
num.sort()
first = num[n-1] #가장 큰 수 저장
second = num[n-2] #두번째로 큰 수 저장
while True:
for i in range(k): #2 1 0 2 1 0
if m==0: #8 7 6 4 3 2
break
sum+= first #6 12 18 29 35 41
m-=1 #m=7 6 5 3 2 1
if m==0: #5 1
break #4 0
sum+=second #23 46
m-=1
print(sum)
3. 그리디 수학적 풀이
#그리디 큰수법칙 수학적 풀이
n,m,k = map(int, input().split())
num = list(map(int, input().split()))
sum = 0
num.sort()
first = num[n-1] #가장 큰 수 저장
second = num[n-2] #두번째로 큰 수 저장
sum = (m//(k+1)) * (first*k+second) + ((m%(k+1))*first) #반복되는 부분은 m//k+1 만큼 곱해주고, 남는 부분은 따로 처리
print(sum)
'코딩테스트👩💻' 카테고리의 다른 글
[이코테] 그리디_part3:문자열 뒤집기 (0) | 2022.03.07 |
---|---|
[이코테] 그리디_part3:곱하기 혹은 더하기 (0) | 2022.03.07 |
[이코테] 그리디_part3:모험가 길드 (0) | 2022.03.07 |
[이코테] 그리디_1이 될때까지 (0) | 2022.03.07 |
[이코테] 그리디_거스름돈 (0) | 2022.03.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 느는중
- 거리벡터
- 백준1260
- 매체접근제어
- 1이될때까지
- tcp/ip흐름제어
- 큰수의법칙
- reno
- slowstart
- 연산자끼워넣기
- 라우팅알고리즘
- 토익 #900점 #토익독학길잡이 #토익독학 #토익공부법
- 데이터베이스시스템
- DFS와BFS
- tahoe
- Colab
- 이코테
- 그리디
- 파이썬
- boj1260
- 백준 #1158 #java
- aimd
- 문자열뒤집기
- 네트워크
- 정보컴퓨터
- ssafy #싸피 #8기 #ssafy전공자
- 14888
- CSMA
- 링크상태
- 모험가길드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함