Algorithm/HackerRank

Candies

Red_Horse 2025. 9. 18. 12:39

출처 : 해커 랭크

난이도 : 중간

알고리즘 : Greedy

 

앨리스는 유치원 선생님입니다. 그녀는 반 아이들에게 사탕을 나눠주고 싶습니다. 모든 아이들은 일렬로 앉아 있고, 각자 수업 성적에 따라 점수를 받습니다. 앨리스는 각 아이에게 최소 사탕을 하나씩 주고 싶어 합니다. 만약 두 아이가 나란히 앉으면, 점수가 높은 아이가 사탕을 더 많이 가져야 합니다. 앨리스는 자신이 사야 하는 사탕의 총 개수를 최소화하려고 합니다.

arr = [4, 6, 4, 5, 6, 2]

그녀는 학생들에게 다음과 같은 최소한의 양의 사탕을 줍니다.

[1,2,1,2,3,1]

그녀는 최소한 사탕 10개 를 사야 합니다.

기능 설명

아래 편집기에서 사탕 기능을 완성하세요 .

사탕에는 다음과 같은 매개변수가 있습니다.

  • int n: 학급의 어린이 수
  • int arr[n]: 각 학생의 평가

보고

  • int: 앨리스가 사야 할 최소 사탕 수

입력 형식

첫 번째 줄에는 정수가 포함됩니다., 크기.
다음 각각lines에는 정수가 포함되어 있습니다학생의 해당 위치 평가를 나타냄.

제약 조건

  • 1 ≤ n ≤ 10^5
  • 1 ≤ arr[i]  10^5

샘플 입력 0

3 
1 
2 
2

샘플 출력 0

4

설명 0

여기서 1, 2, 2는 평점입니다. 두 아이의 평점이 같을 때, 각 아이에게 주어지는 사탕의 개수는 서로 다릅니다. 따라서 최적의 분포는 1, 2, 1입니다.

샘플 입력 1

10 
2 
4 
2 
6 
1 
7 
8 
9 
2 
1

샘플 출력 1

19

설명 1

최적의 분포는 다음과 같습니다.

1212123421

샘플 입력 2

8 
2 
4 
3 
5 
2 
6 
4 
5

샘플 출력 2

12

설명 2

최적의 분포는 다음과 같습니다.

12121212

 

 

----------------------------------------------------------------------------------------------------------------------------

 

문제 해독


반 아이들에게 사탕을 나누어 줄때 수업 성적과 앉아있는 순서에 따라 사탕을 줄 때 몇개의 사탕을 준비해야 하는지 구하는 문제

모든 아이들은 사탕을 1개 이상씩 받아야하며 앞에 있는 아이보다 뒤에 있는 아이가 성적이 높을 경우 사탕을 1개 더 받습니다.

 

문제접근

 

첫번째 접근 : 좌측에서 우측으로 순서대로 사탕을 줄때 앞에 있는 아이보다 뒤에 있는 아이가 성적이 높으면 1개 증가시키고 만약 뒤에 있는 아이보다 앞에 있는 아이가 성적이 낮으면 1개의 사탕을 준다.

 - 오답 발생 : 정방향만 계산하여 앞에 있는 아이와 현재 사탕을 줄 아이의 계산 결과가 올바르지 않음. 역 연산도 필요

 

두번째 접근 : 정방향 연산과 역방향 연산을 수행.

정방향 : 앞에 있는 아이보다 성적이 높으면 캔디 추가

역방향 : 뒤에 있는 아이보다 성적이 높으면 캔디 추가(단 이전 정방향 연산과 비교하였을떄 큰수를 대입)

 

public static long candies(int n, List<int> arr)
    {
        long result = 0;
        long[] candies = new long[n];
        for(int i = 0; i < n; i++)
        {
            candies[i] = 1;
        }
        
        for(int i = 1; i < n; i++)
        {
            if(arr[i] > arr[i - 1])
                candies[i] = candies[i - 1] + 1;
        }
        
        for(int i = n - 2; i >= 0; i--)
        {
            if(arr[i] > arr[i + 1])
                candies[i] = Math.Max(candies[i], candies[i + 1] + 1);
        }
            
        for(int i = 0; i < n; i++)
            result += candies[i];
        
        return result;
    }

'Algorithm > HackerRank' 카테고리의 다른 글

The Coin Change Problem  (0) 2025.09.18
Marc's Cakewalk  (0) 2025.09.18
Minimum Loss  (1) 2025.09.18
Hackerland Radio Transmitters  (0) 2025.09.17
Climbing the Leaderboard  (0) 2025.09.17