< 2 > 큰 수의 법칙
n,m,k가 있습니다. n은 배열의 원소 갯수, m은 더하는 횟수, k는 연속한 수가 k번 초과할 수 없음을 의미합니다.
이를 가지고 원소들을 더해서 가장 큰수를 만드는 것이 목적입니다.
ex) n=5이면 2,4,5,4,6로 원소 5개를 주고 m=8, k=3이라면 6+6+6+5+6+6+6+5 =46이 됩니다.
입력예시
5 8 6
2 4 5 4 6
출력 예시
46
1
2
3
4
5
6
7
8
9
10
11
12
|
N, M, K = map(int,input().split())
a = sorted(list(map(int,input().split())))
cnt = 0
a_sum = 0
for i in range(M):
if cnt == K: #k초과지만 cnt가 k가 되면 이미 k수만큼 넣은거라 ==해야함.
a_sum += a[-2]
cnt = 0
else :
a_sum += a[-1]
cnt += 1
print(a_sum)
|
cs |
풀이 생략
< 3 > 숫자 카드 게임
처음에 원하는 n x m 형태의 행렬로 선언합니다.
그리고 한가지의 행을 선택하여 가장 낮은 수를 뽑되 최종적으로 그 수가 가장 높은 숫자여야 합니다.
ex) 예시에서 보는 것과 같이 1행의 최소는 1, 2행은 1, 3행은 2입니다. 그러므로 3행을 뽑고 최솟값을 출력시키는 것이 목적입니다.
입력예시
3 3
3 1 2
4 1 4
2 2 2
출력예시
2
1
2
3
4
5
6
7
8
|
n,m = list(map(int,input().split()))
result= 0
for i in range(n):
data = list(map(int,input().split()))
min_data = min(data) #최솟값을 구하고
result=max(result,min_data) #최솟값구한것들중에 큰값
print(result)
|
cs |
풀이: 가장 작은, 가장 큰 값이라는 단어를 먼저 보자말자 그리디 문제임으로 min,max를 바로 생각해봅니다. 이 문제같은 경우는 각 행의 최솟값이자 각 행간에는 최댓값이여야 합니다. 그러므로 이전 행에 대한 값이 필요하므로 result변수를 통해 계속 이전 행을 포함시킨 최댓값이 for문 안에서 작동하는 것이 편리합니다.
<4> 1이 될 때까지
어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행합니다.
1.N에서 1을 뺍니다.
2.N을 K로 나눕니다.(나눌 때는 나머지가 0인 경우만 가능)
최종적으로 실행했을 때 최소 횟수를 구합니다.
ex) 17, 4 -> -1, /4 /4 = 3번
20, 5 -> /5 -1 -1 -1 4번
20, 4 -> /4 -1 -1 -1 -1 5번
입력예시
25 5
출력예시
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
n,k = list(map(int,input().split()))
count = 0
while True:
#n이 m으로 나눠떨어질 수 있도록 -1을 진행
div_num = (n//k) * k
count += n-div_num
n = div_num
# 더이상 나눠줄 수 없을 때 탈출
if n < k:
break
#나눗셈 진행
n = n//k
count += 1
#마지막 수에서 -1한 값이 1을 빼주는 횟수자체가 됨.
count += n-1
print(count)
|
cs |
풀이: -1을 하는 것보다 나눗셈을 진행하는 것이 무조건 최소횟수로 가는 방법입니다. 그렇기 때문에 나눗셈이 진행될 수 있도록 처음에 -1을 진행 그런 다음 나눠줍니다. 이게 기본과정입니다.
여기서 나눠지게 만들기 위해 -1을 한 횟수를 적을 때 COUNT도 같이 적어줍니다.
여기서 처음부터 4 5로 주어지면 나눠지지가 않으므로 If문을 걸어 나눠지는지 확인합니다. 나눠진다면 나눗셈을 하고 20 4 케이스처럼 한번더 위의 과정을 진행합니다.
결국엔 n<k인 순간이 오게되고 이 때는 구한 값에서 1을 뺀 값이 -1을 해야되는 횟수와 같습니다.
'코딩테스트 > 그리디' 카테고리의 다른 글
[python] 백준 11399번: ATM (0) | 2023.01.30 |
---|---|
[python] 백준 11047번: 동전 0 (0) | 2023.01.28 |
그리디 문제 모음 (0) | 2023.01.26 |
댓글