본문 바로가기

알고리즘/백준

[12847] 꿀 아르바이트(python)

1. 문제

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

 

12847번: 꿀 아르바이트

월세를 내기 바로 전 날 까지 인 n (0 < n ≤ 100,000) 일과 일을 할 수 있는 날 m (0 ≤ m ≤ n) 일이 주어진다. 그 다음 줄 에는 1일부터 n일 까지 일급 Ti가 순서대로 주어진다. (0 < Ti ≤ 1,000,000)

www.acmicpc.net

 

2. 구현 과정

- 시간 제약이 1초이므로, O(N^2)만 되어도 안된다. N의 범위가 10만이므로, 최대 NlogN으로 풀어야 한다.

-  누적합 함수인 accumulate를 사용해서 dp형식으로 푸는 방법과 투 포인터를 사용하는 방식 두 가지 방식으로 풀 수 있다. 개인적으로 투 포인터 문제는 익숙치 않아서, 후자 푸는 연습을 해야할 듯!

 

-  for문 두 번 돌리는 방법 

for i in range(0, n-m):
    pay_sum = 0
    for j in range(i, i+m):
        pay_sum += pay[j]
    answer = max([answer, pay_sum])


투 포인터를 사용해서 이중 포문을 포문 하나로 바꾸는 법

 pay_sum = sum(pay[0 : m])

for i in range(0, n - m):
    pay_sum += pay[i + m] - pay[i]

 

위 방식으로 가장 큰 pay_sum값을 리턴한다.

 

 

3. 실수한 것 & 처음 안 것

- from itertools import accumulate : list의 누적 합을 차례로 출력해줌

 

4. 코드

더보기
from itertools import accumulate

N,M = map(int,input().split())
pays = list(map(int,(input().split())))
sum_list = list(accumulate(pays))
dp = [0] * N

for x in range(N):
	if x < M:
		dp[x] = sum_list[x]
	else:
		dp[x] = max(dp[x-1],sum_list[x] - sum_list[x-M])

print(dp[N-1])


---------------------------------------------
N,M = map(int,input().split())
pays = list(map(int,input().split()))

answer = sum_pays = sum(pays[0:M])

for i in range(0, N-M):
    sum_pays += pays[M+i] - pays[i]
    answer = max( answer, sum_pays )
print(answer)

'알고리즘 > 백준' 카테고리의 다른 글

[4485] 녹색 옷 입은 애가 젤다지?(python)  (0) 2021.08.27
[2110] 공유기 설치(python)  (0) 2021.08.01
[18111] 마인크래프트(python)  (0) 2021.08.01
[1654] 랜선 자르기(python)  (0) 2021.07.26
[9012]괄호  (0) 2020.12.10