Candy 문제 Link
https://leetcode.com/problems/candy/ (opens in a new tab)
내 풀이
시간초과로 못 풀었다. 왜 이렇게 풀었는지는 그냥 하나하나 Test Case에 대한 예외처리를 하다보니까 이렇게 됐다. 언제쯤이면 깔끔한 풀이를 제대로 해낼 수 있을까......
class Solution:
def candy(self, ratings: list[int]) -> int:
costs = [1 for _ in range(len(ratings))]
for i in range(len(ratings)):
cur = i
if i != len(ratings) - 1:
for j in range(i + 1, len(ratings)):
# 이전 아이가 점수가 더 높은 경우 멈춤
if ratings[cur] > ratings[j]:
cur = j
row = cur - 1
while ratings[row] > ratings[cur] and row > -1 :
if costs[row] > costs[cur] :
break
costs[row] = costs[cur] + 1
row -= 1
cur -= 1
break
# 같은 점수에 온 경우 멈춤
if ratings[cur] == ratings[j]:
break
if ratings[cur] < ratings[j]:
costs[j] = costs[cur] + 1
cur += 1
return sum(costs)
Candy 문제 풀이
양쪽의 아이들보다 숫자가 큰 아이는 사탕을 더 많이 가져가야 한다.
양쪽이라는 말은 앞에서 봐도, 뒤에서 봐도 더 크다는 뜻이다.
이를 이용해서 양쪽 방향에서 한 순회를 하면서 숫자가 더 크면 사탕을 더 많이 주면 된다.
class Solution:
def candy(self, ratings: list[int]) -> int:
N = len(ratings)
nums = [1] * N
for n in range(1, N):
if ratings[n - 1] < ratings[n]:
nums[n] = nums[n - 1] + 1
for n in range(N - 1, 0, -1):
if ratings[n - 1] > ratings[n]:
nums[n - 1] = max(nums[n - 1], nums[n] + 1)
return sum(nums)