ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ฝ”๋“œ ์ฒ˜๋ฆฌํ•˜๊ธฐ - js (reduceํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•)

2023. 7. 26. 18:14ใ†Study_Develop/์•Œ๊ณ ๋ฆฌ์ฆ˜ | ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

๋ฐ˜์‘ํ˜•

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ฝ”๋“œ ์ฒ˜๋ฆฌํ•˜๊ธฐ - js

 

๋ฌธ์ œ

 

๋ฌธ์ž์—ด code๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
code๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฝ์œผ๋ฉด์„œ ๋งŒ์•ฝ ๋ฌธ์ž๊ฐ€ "1"์ด๋ฉด mode๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. mode์— ๋”ฐ๋ผ code๋ฅผ ์ฝ์–ด๊ฐ€๋ฉด์„œ ๋ฌธ์ž์—ด ret์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

mode๋Š” 0๊ณผ 1์ด ์žˆ์œผ๋ฉฐ, idx๋ฅผ 0 ๋ถ€ํ„ฐ code์˜ ๊ธธ์ด - 1 ๊นŒ์ง€ 1์”ฉ ํ‚ค์›Œ๋‚˜๊ฐ€๋ฉด์„œ code[idx]์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–‰๋™ํ•ฉ๋‹ˆ๋‹ค.

mode๊ฐ€ 0์ผ ๋•Œ
code[idx]๊ฐ€ "1"์ด ์•„๋‹ˆ๋ฉด idx๊ฐ€ ์ง์ˆ˜์ผ ๋•Œ๋งŒ ret์˜ ๋งจ ๋’ค์— code[idx]๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
code[idx]๊ฐ€ "1"์ด๋ฉด mode๋ฅผ 0์—์„œ 1๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
mode๊ฐ€ 1์ผ ๋•Œ
code[idx]๊ฐ€ "1"์ด ์•„๋‹ˆ๋ฉด idx๊ฐ€ ํ™€์ˆ˜์ผ ๋•Œ๋งŒ ret์˜ ๋งจ ๋’ค์— code[idx]๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
code[idx]๊ฐ€ "1"์ด๋ฉด mode๋ฅผ 1์—์„œ 0์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด code๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฌธ์ž์—ด ret๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

๋‹จ, ์‹œ์ž‘ํ•  ๋•Œ mode๋Š” 0์ด๋ฉฐ, return ํ•˜๋ ค๋Š” ret๊ฐ€ ๋งŒ์•ฝ ๋นˆ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ๋Œ€์‹  "EMPTY"๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.

 



 

์ œํ•œ์‚ฌํ•ญ

1 ≤ code์˜ ๊ธธ์ด ≤ 100,000
code๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž ๋˜๋Š” "1"๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ
code result
"abc1abc1abc" "acbac"

 

solution.js
function solution(code) {
    let mode = 0
    return [...code].reduce((a, b, idx) => {
        if(mode) {
            if(b !== '1' && idx%2 === 1)  return a+b
            if(b === '1') mode = 0
        } else {
            if(b !== '1' && idx%2 === 0)  return a+b
            if(b === '1') mode = 1
        }
            
        return a
    }, "") || "EMPTY"
}

 

- solution(code) ๋Š” ๋ฌธ์ž์—ด code๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

 

- mode๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ์ฒ˜๋ฆฌ ๋ชจ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋กœ,  0๊ณผ 1 ๋‘ ๊ฐ€์ง€ ๊ฐ’์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„๋‹ค.

 

- return [...code].reduce((a, b, idx) => {...} : ๋ฌธ์ž์—ด code๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค reduce ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.

 

- if(mode) {...} else {...} : ํ˜„์žฌ ์ฒ˜๋ฆฌ ๋ชจ๋“œ์— ๋”ฐ๋ผ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋ถ„๊ธฐ๋œ๋‹ค.

 

- else๋ชจ๋“œ (0๋ชจ๋“œ)์—์„œ 

if (cur !== '1 ' && idx % 2 === 0) return a+ b: ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ 1์ด ์•„๋‹ˆ๊ณ , ์ธ๋ฑ์Šค๊ฐ€ ์ง์ˆ˜์ธ ๊ฒฝ์šฐ, ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์— ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

if (b=== '1 ') mode = 1: ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ 1์ธ ๊ฒฝ์šฐ, ๋ชจ๋“œ๋ฅผ 1๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์Œ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

- return a: ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•œ ํ›„, ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

- ""||"EMPTY" : ๋งŒ์•ฝ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ๋Œ€์‹  "EMPTY"๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

reduce () ํ•จ์ˆ˜?

 

arr.reduce(callback[, initialValue])

 

- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ reduceํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ callbackํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฐ’์„ ๋ˆ„์ ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•œ๋‹ค.

 

 

์˜ˆ์ œ 1. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’ (1๋ถ€ํ„ฐ 10๊นŒ์ง€ ) ๋”ํ•˜๊ธฐ

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const sum1 = numbers.reduce((accumulator, currentNumber) => accumulator + currentNumber);

console.log('sum1 =', sum1);