파란색가운의 개발 블로그
[이코테] CH03 그리디 실전문제 큰수의법칙 본문
import sys
# sys.stdin.readline()
from collections import deque
sys.setrecursionlimit(100000000)
import heapq
INF = 1e9
N,M,K = map(int,sys.stdin.readline().split())
x = list(map(int,sys.stdin.readline().split()))
x.sort(reverse = True)
max = x[0]
max2 = x[1]
sum = 0
index = 0
print(x)
for _ in range(M):
index +=1
if index % K == 0:
sum+=max2
else:
sum += max
print(sum)
일단 이게 내가 처음 짠 코드
k번은 가장 큰 숫자, 1번은 두번째로 큰 숫자 더하는 식으로 했는데
M이 커질수록 시간복잡도가 커진다 : O(M)
그러므로 시간복잡도를 더 효율적으로 할 수 있는 방법이 있다 ! (for문을 사용하지 않고도 해결할 수 있음)
import sys
# sys.stdin.readline()
from collections import deque
sys.setrecursionlimit(100000000)
import heapq
INF = 1e9
N,M,K = map(int,sys.stdin.readline().split())
x = list(map(int,sys.stdin.readline().split()))
x.sort(reverse = True)
max = x[0]
max2 = x[1]
sum = 0
count = int(M/(K+1)) * K
# 여기서 K+1은 수열의 길이. 가장 큰 수가 K번 / 두번째 큰 수가 1번 등장해서 총 K+1의 길이인 수열
# int(M/K+1)은 전체 수열의 반복 횟수. 거기에 k를 곱해주면 가장 큰 수가 나오는 총 횟수가 나온다.
count += M % (K+1)
# 그리고 나머지 숫자를 더해줘야 한다 (M/(K+1))이 나누어떨어지지 않는 경우 고려
sum += count * max
# max는 가장 큰 수, 카운트는 가장 큰 숫자가 나오는 횟수
sum += (M-count) * max2
#반복은 총 M번이므로 M-count가 2번째 큰 숫자가 나오는 횟수
print(sum)
이렇게 생각할 수 있도록
여러가지 문제를 풀어봐야겠다고 느꼈다.
쉬운 문제여도 얻어갈게 확실히 있다는걸 느꼈다
'알고리즘 문제 풀이 > 이코테' 카테고리의 다른 글
[이코테] CH03 그리디 실전문제 1이 될 때 까지 (0) | 2023.11.15 |
---|---|
[이코테] CH03 그리디 실전문제 숫자 카드 게임 (0) | 2023.11.13 |
[이코테] DFS/ BFS 실전문제 4 미로 탈출 (0) | 2023.11.04 |
[이코테] DFS/BFS 실전문제 3 음료수 얼려 먹기 (0) | 2023.11.02 |
[이코테 Python] 구현 실전문제 3 게임 개발 (0) | 2023.10.03 |