728x90
반응형
https://www.acmicpc.net/problem/13904
13904번: 과제
예제에서 다섯 번째, 네 번째, 두 번째, 첫 번째, 일곱 번째 과제 순으로 수행하고, 세 번째, 여섯 번째 과제를 포기하면 185점을 얻을 수 있다.
www.acmicpc.net
최종 코드
GitHub - hwayeon351/BEAKJOON-Algorithms: 백준 알고리즘 소스 코드 모음
백준 알고리즘 소스 코드 모음. Contribute to hwayeon351/BEAKJOON-Algorithms development by creating an account on GitHub.
github.com
import sys
def get_max_score(homework, N):
day = homework[0][0]
visit = [0]*N
score = 0
while day > 0:
i = -1
for j in range(N):
if visit[j]: continue
if homework[j][0] >= day:
if i == -1: i = j
elif homework[j][1] > homework[i][1]: i = j
if i != -1:
visit[i] = 1
score += homework[i][1]
day -= 1
print(score)
input = sys.stdin.readline
N = int(input())
homework = list()
for _ in range(N):
homework.append(list(map(int, input().split())))
homework.sort(reverse = True)
get_max_score(homework, N)
풀이 과정
import sys
def get_max_score(homework, N):
#가장 마지막 과제의 남은 일 수로 day 초기화
day = homework[0][0]
score = 0
#i번째 과제를 이미 했다면 visit[i] = 1, 아직 안했다면 visit[i] = 0
visit = [0]*N
while day > 0:
i = -1
#day에 할 수 있는 과제 중 가장 점수가 높은 과제를 선택한다
for j in range(N):
if visit[j]: continue
if homework[j][0] >= day:
if i == -1: i = j
elif homework[j][1] > homework[i][1]: i = j
#할 수 있는 과제가 있는 경우,
if i != -1:
visit[i] = 1
score += homework[i][1]
day -= 1
print(score)
input = sys.stdin.readline
N = int(input())
homework = list()
for _ in range(N):
homework.append(list(map(int, input().split())))
#과제의 남은 일수와 점수의 역순으로 정렬
homework.sort(reverse = True)
get_max_score(homework, N)
#시간복잡도 = O(n^2), 공간복잡도 = O(n)
이전 풀이
풀이 시간 30분
N = int(input())
//dw[i] = [남은 일수, 과제 점수]
dw = [[0,0] for _ in range(N)]
//visit[i] = 0 -> i번째 과제 아직 하지 않음
//visit[i] = 1 -> i번째 과제 함
visit = [0]*N
for i in range(N):
dw[i] = list(map(int, input().split()))
//남은 일수를 기준으로 내림차순 정렬 -> O(n) = nlogn
dw.sort(reverse = True)
//가장 많이 남은 일수를 timer로 set
timer = dw[0][0]
total = 0
//timer == 0일 때까지 과제 수행 -> O(n) = n^2
while timer > 0:
//과제 idx
idx = -1
for i in range(N):
//i번째 과제의 남은 일수가 현재 시간보다 이전이면 해당 과제를 할 수 없다
if dw[i][0] < timer: break
//i번째 과제를 할 수 있는 경우
if visit[i] == 0:
if idx == -1: idx = i
//i번째 과제가 현재 시간에서 할 수 있는 과제 중 가장 큰 점수를 가진 경우 idx 값 갱신
elif dw[idx][1] < dw[i][1]: idx = i
//할 수 있는 과제가 있는 경우, 과제를 수행한다
if idx != -1:
visit[idx] = 1
total += dw[idx][1]
timer-=1
print(total)
#시간복잡도 = O(n^2), 공간복잡도 = O(n)
728x90
반응형
'코테 노트 > 백준' 카테고리의 다른 글
백준 8980 택배 Python3 (0) | 2021.08.12 |
---|---|
백준 15685 드래곤 커브 C++ (0) | 2021.08.12 |
백준 15684 사다리 조작 C++ (0) | 2021.08.11 |
백준 1092 배 Python3 (0) | 2021.08.11 |
백준 21610 마법사 상어와 비바라기 C++ (0) | 2021.08.10 |