[HackerRank] Candies

1 minute read

문제정보

어떻게 풀까?

아이들의 성적에 따라 캔디를 나눠주는 문제이다. 마주앉은 아이 중 성적이 높은 아이는 더 많은 캔디를 받아야 한다. 최소한의 캔디로 분배해야 한다.

배열을 만들어 앞에서부터 한 번, 뒤에서부터 한 번 순회하며 이전 아이보다 성적이 높으면 (이전아이)+1, 아니면 1을 넣는다.

이 두 배열 값을 비교하여 더 큰 값을 Sum하여 값을 구한다. 값을 배열에 저장한다는 의미에서 DP문제로 분류해둔 것 같다.

문제풀이(Java)

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Solution {
    
    static long candies(int n, int[] arr) {
        long sum = 0;
        int[] dp_up = new int[arr.length];
        int[] dp_down = new int[arr.length];
        dp_up[0] = 1;
        dp_down[arr.length-1] = 1;
        
        for(int i=1; i<arr.length; i++){
            dp_up[i] = (arr[i-1] < arr[i]) ? (dp_up[i-1] + 1) : 1;
        }

        for(int i=arr.length-2; i>=0; i--){
            int t = (arr[i+1] < arr[i]) ? (dp_down[i+1] + 1) : 1;
            dp_down[i] = Math.max(dp_down[i], t);
        }
        
        for(int i=0; i<arr.length; i++) {
        	sum += Math.max(dp_up[i], dp_down[i]);
        }
        
        return sum;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        int n = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            int arrItem = scanner.nextInt();
            scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
            arr[i] = arrItem;
        }

        long result = candies(n, arr);

        bufferedWriter.write(String.valueOf(result));
        bufferedWriter.newLine();

        bufferedWriter.close();

        scanner.close();
    }
}

Leave a comment