๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/LeetCode

[LeetCode] Candy

๋ฌธ์ œ๋งํฌ

 

Candy - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

๋ชจ๋“  ์•„์ด์—๊ฒŒ ์‚ฌํƒ•์„ ๋‚˜๋ˆ ์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ•์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
ratings : ์ˆœ์œ„๋ฐฐ์—ด

์กฐ๊ฑด 1. ๋ชจ๋“  ์•„์ด๋Š” ์ตœ์†Œ 1๊ฐœ์˜ ์‚ฌํƒ•์„ ๋ฐ›์•„์•ผํ•œ๋‹ค.
์กฐ๊ฑด 2. ์ด์›ƒํ•œ ์•„์ด๋“ค๋ผ๋ฆฌ๋Š” ๋” ๋†’์€ rating์„ ๊ฐ–๋Š” ์•„์ด๊ฐ€ ๋” ๋งŽ์€ ์บ”๋””๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ฒ˜์Œ์—๋Š” left, right ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด sliding window ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.
ํ•˜์ง€๋งŒ ratings = [3, 2, 1, 2, 3] ๊ฐ™์€ ๋ถ€๋ถ„์—์„œ left์™€ right์˜ ์ด๋™ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋ ค๋ฉด ์กฐ๊ฑด์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์กŒ๊ณ 

์™„์ „ ํƒ์ƒ‰์„ ์•ž์—์„œ๋ถ€ํ„ฐ 1๋ฒˆ, ๋’ค์—์„œ๋ถ€ํ„ฐ 1๋ฒˆ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค.

1. ratings ๊ธธ์ด์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ชจ๋“  ๊ฐ’์„ 1๋กœ ์ฑ„์šด๋‹ค.
let candyArr = new Array(ratings.length).fill(1);โ€‹

2. ratings๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ratings[i -1] < ratings[i] ์ผ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
( ratings = [5, 3, 1, 2, 3] => candyArr = [1, 1, 1, 2, 3] )
for(let i = 1; i < ratings.length; i++){
    if(ratings[i-1] < ratings[i]) candyArr[i] = candyArr[i-1] + 1;
}โ€‹

3. ratings๋ฅผ ๋’ค์—์„œ๋ถ€ํ„ฐ ratings[i] > ratings[i + 1] ์ผ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
( ratings = [5, 3, 1, 2, 3] => candyArr = [1, 1, 1, 2, 3] => candyArr = [3, 2, 1, 2, 3] )

for(let i = ratings.length - 2; i >= 0; i--){
    if(ratings[i] > ratings[i+1]){
        candyArr[i] = Math.max(candyArr[i], candyArr[i+1] + 1)
    }
}โ€‹


 

/**
 * @param {number[]} ratings
 * @return {number}
 */
var candy = function(ratings) {
    let output = 0;
    let candyArr = new Array(ratings.length).fill(1);
    
    for(let i = 1; i < ratings.length; i++){
        if(ratings[i-1] < ratings[i]) candyArr[i] = candyArr[i-1] + 1;
    }
    
    for(let i = ratings.length - 2; i >= 0; i--){
        if(ratings[i] > ratings[i+1]){
            candyArr[i] = Math.max(candyArr[i], candyArr[i+1] + 1)
        }
    }
    
    output = candyArr.reduce((acc, cur) => acc + cur)
    return output
};