Coding Test/그리디 알고리즘

[그리디 알고리즘] 1758번 알바생 강호 풀이(파이썬)

Klay_J 2023. 1. 26. 20:19

안녕하세요. Harry입니다.

 

본 포스팅의 목적은, 코딩테스트를 준비함에 있어 백준에 제시된 문제 풀이와 스스로 얻은 정보를 정리하고자 합니다.

그러므로 단순히 문제를 푸는 것이 중요한 것이 아니라, 문제를 통해 얻어가는 것이 있어야하기 때문에 접근 방식은 이전 기초 300제를 풀었을 때랑 동일합니다.

 

[접근 방식]

- 문제에서 요구하는 역량은 무엇인지?

- 알고 있어야하는 지식은 무엇인지? 에 기반하여 풀이하고자 합니다.

 

- 백준 문제 링크입니다. : https://www.acmicpc.net/problem/1758

 

1758번: 알바생 강호

첫째 줄에 스타박스 앞에 서 있는 사람의 수 N이 주어진다. N은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 총 N개의 줄에 각 사람이 주려고 하는 팁이 주어진다. 팁은 100,000보다 작거나 같

www.acmicpc.net

아래 작성된 답안은 제가 직접 작성 후 백준 페이지에서 채점하여 정답으로 인정된 답안입니다.
공식 답안이 아니므로 최적의 해가 아닐 수 있으며, 답안은 다른 분들과 상이할 수 있습니다.

 

[풀이]

n = int(input())
line = [int(input()) for i in range(n)]
line = sorted(line)
line.reverse()
tip = 0
for i in range(n):
    if line[i]-i < 0:
        tip += 0
    else:
        tip += line[i]-i
print(tip)

기본적인 전제는, 가장 많은 팁을 주고자하는 손님순으로 순서를 세워야한다는 것입니다.

문제에서 요구하는 것이 강호가 받을 수 있는 팁의 최대값이므로, (팁-순서)의 값이 큰 순이어야 하기 때문입니다.

이를 위해 손님이 제공할 팁이 큰 순서대로 line을 정렬하였습니다.(sort 후 reverse)

이후 for문을 통해 (팁-순서)가 양수(0포함)일 동안 tip에 (팁-순서)만큼 더해주었고, 음수가 되면 0을 더해 tip을 그대로 유지하도록 하였습니다.

 

감사합니다.