문제 난이도 : Medium


문제 유형 : Greedy


문제 설명 간략 : 엘리스는 유치원 선생님이고 최소한 사탕 1개씩 아이들에게 주고 싶고 점수가 높은 아이에게는 하나 더 주고 싶다. 총 엘리스가 주어야할 사탕의 최소 개수를 구하여라.


제약사항

  • 1 <= n <= 10^5
  • 1 <= arr[i] <= 10^5


idea

  1. 루프를 돌면서 이전 값보다 현재 값이 크면 이전 값에 +1 아닌 경우 일단 1을 배정. (왼쪽의 큰 값에 대한 만족)
  2. 거꾸로 루프를 돌면서 이전 값이 현재 값보다 크면 이전 사탕 개수는 현재 사탕 개수보다 하나 더 배정. (오른쪽의 큰 값에 대한 만족)


자바 풀이

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;

class Result {

    /*
     * Complete the 'candies' function below.
     *
     * The function is expected to return a LONG_INTEGER.
     * The function accepts following parameters:
     *  1. INTEGER n
     *  2. INTEGER_ARRAY arr
     */

    public static long candies(int n, List<Integer> arr) {

        long sum = 0;

        int size = arr.size();

        int candies [] = new int [size];

        candies[0] = 1;

        for(int i = 1; i < size; i++) {
            int candy = 1;
            if(arr.get(i) > arr.get(i-1)) {
                candy = candies[i-1]+1;
            }
            candies[i] = candy;
        }

        for(int j = size-1; j > 0; j--) {

            if(arr.get(j-1) > arr.get(j)) {
                candies[j-1] = Math.max(candies[j-1],candies[j]+1);
            }

            sum += candies[j];
        }

        sum += candies[0];

        return sum;
    }

}

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

        int n = Integer.parseInt(bufferedReader.readLine().trim());

        List<Integer> arr = IntStream.range(0, n).mapToObj(i -> {
            try {
                return bufferedReader.readLine().replaceAll("\\s+$", "");
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        })
                .map(String::trim)
                .map(Integer::parseInt)
                .collect(toList());

        long result = Result.candies(n, arr);

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

        bufferedReader.close();
        bufferedWriter.close();
    }
}


파이썬 풀이

#!/bin/python3

import math
import os
import random
import re
import sys

#
# Complete the 'candies' function below.
#
# The function is expected to return a LONG_INTEGER.
# The function accepts following parameters:
#  1. INTEGER n
#  2. INTEGER_ARRAY arr
#

def candies(n, arr):
    sum = 0;
    
    candies = [];
    candies.append(1);
    
    for i in range(1, len(arr), 1):
        candy = 1;
        if arr[i] > arr[i-1] :
            candy = candies[i-1]+1;
        candies.append(candy);
    
    for j in range(len(arr)-1, 0, -1):
        if arr[j-1] > arr[j]:
            candies[j-1] = max(candies[j-1],candies[j]+1);
        sum += candies[j];
        
    sum += candies[0];
    
    return sum;

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    n = int(input().strip())

    arr = []

    for _ in range(n):
        arr_item = int(input().strip())
        arr.append(arr_item)

    result = candies(n, arr)

    fptr.write(str(result) + '\n')

    fptr.close()


출처

해커랭크 문제