Candy

zoovely·2024년 4월 26일
0
post-thumbnail

💬 문제

[문제 링크]

아이들의 점수가 담긴 정수 배열 ratings
각 아이들은 기본적으로 사탕을 하나씩 받음
양 옆 인덱스의 값 보다 현재 인덱스 값이 큰 경우 (이웃보다 점수가 높을 경우)
양쪽보다 사탕을 더 많이 받아야함
최소로 필요한 사탕 갯수 구하기

✍️ 나의 풀이

/**
 * @param {number[]} ratings
 * @return {number}
 */
var candy = function(ratings) {
    let candies = new Array(ratings.length).fill(1);

    for (let i = 1; i < ratings.length; i++) {
        if (ratings[i] > ratings[i - 1] && candies[i] <= candies[i - 1])
            candies[i] = candies[i - 1] + 1;
    }

    for (let i = ratings.length - 2; i >= 0; i--) {
        if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1])
            candies[i] = candies[i + 1] + 1;
    }

    return candies.reduce((prev, curr) => prev + curr, 0);
};

먼저 0부터 끝까지 돌면서 자신과 왼쪽 사람을 비교
본인 점수가 더 높은데 사탕이 더 적거나 같다면 그 사람의 사탕 수 +1
끝나면 다시 뒤에서부터 0까지 자신과 오른쪽 사람을 비교
똑같은 조건이라면 그 사람의 사탕 수 +1
기록해둔 배열(candies)의 값 합을 구하여 반환

📌 결과

Accepted
Runtime 68ms (Beats 44.77%)
Memory 53.39MB (Beats 51.32%)

📚 러닝 포인트

처음으로 풀어보는 hard 단계여서 살짝 쫄았는데 생각보다는 쉬웠다. 일단은 한바퀴 돌면서 왼쪽도 비교하고 오른쪽도 비교하려고 했는데 같은 평판의 사탕 수가 달라져버리면 다시 확인해야 한다는 점을 깨달아서 두번으로 나눠서 확인했다. 포인트는 왼쪽에서 오른쪽으로 갈 때는 왼쪽 사람과 비교하고, 오른쪽에서 왼쪽으로 돌 때는 오른쪽 사람이랑 비교해야한다. 처음에 반대로 했다가 원하는 결과가 나오지 않았다. 반대로 하면 한번에 왼쪽 오른쪽을 같이 보는 경우랑 똑같더라. 하여튼 오늘은 크게 문제되는 부분 없이 완료!

profile
나도 할 수 있을까?

0개의 댓글