[프로그래머스] 기능개발

정예원·2021년 8월 15일
1

문제풀이

목록 보기
7/9
post-thumbnail

기능개발 문제를 함수형 프로그래밍으로 풀어보자.

문제 해결

function solution(progresses, speeds) {
    const [answer] = go(
        zip(progresses)(speeds),
        map(([progress, speed]) => countPeriod(progress, speed)),
        deploymentCount
    );

    return answer;
}

한줄씩 뜯어서 살펴보도록 하자.

1. zip(progresses)(speeds)

zip을 이용해 progressesspeeds의 값을 하나씩 받아온다.

2. map(([progress, speed]) => countPeriod(progress, speed))

zip에서 받아온 진도개발 속도
countPeriod함수를 이용하여 새로운 객체 만든다.

countPeriod : 배포까지 걸리는 시간(작업일)을 계산하여 반환하는 함수

const countPeriod = (progress, speed) => {
    return Math.ceil((100 - progress) / speed);
};

3. deploymentCount

문제 해결의 핵심 함수이다.

deploymentCount 는 작업일 배열을 받아 문제에 맞춰 적합하게 배포일을 만들어나간다.

const deploymentCount = (periods) =>
    reduce(([counts, total_period], period) =>
        total_period < period ? 
           [inc(counts, counts.length), period] 
           : [inc(counts, counts.length - 1), total_period]
     )([[], 0], periods);

zip을 한 결과가 periods 배열이라고 가정하면

periods = [5, 10, 1, 1, 20, 1]
결과 = [ [ 1, 3, 2 ], 20 ]

reduce(f)([[], 0], periods) : periods를 함수f에 대해 reduce 실행

[counts, total_period], period =>
        total_period < period ? 
           [inc(counts, counts.length), period] 
           : [inc(counts, counts.length - 1), total_period]

디버깅을 통해서 결과출력 과정을 자세히 살펴보자.

1. period = 5

total_period < period의 값이 true이므로

counts = inc(counts = [] , count.length = 0) // counts가 빈 배열이므로 counts = [1]이 된다.

total_period = period = 5

    function inc(parent, k) {  
    parent[k] ? parent[k]++ : (parent[k] = 1);
    return parent;
}

2. period = 10

total_period < period의 값이 true이므로

counts = inc(counts = [1] , count.length = 1) // counts = [1, 1]
total_period = period = 10

3. period = 1

total_period < period의 값이 false이므로

counts = inc(counts = [1, 1], counts.length - 1 = 1) // 함께 배포할 기능 개수를 증가한다. counts = [1, 2]
total_period = 10

4. period = 1

total_period < period의 값이 false이므로

counts = inc(counts = [1, 2], counts.length - 1 = 1) // 함께 배포할 기능 개수를 증가한다. counts = [1, 3]
total_period = 10

5. period = 20

total_period < period의 값이 true이므로

counts = inc(counts = [1, 3], counts.length = 2) // counts = [1, 3, 1]
total_period = 20

6. period = 1

total_period < period의 값이 false이므로

counts = inc(counts = [1, 3, 1], counts.length - 1 = 2) // 함께 배포할 기능 개수를 증가한다. counts = [1, 3, 2]
total_period = 20

profile
hello world!

2개의 댓글

comment-user-thumbnail
2021년 8월 23일

멘토님이 추천해주신 이유가 있었군요!👍
글이 가독성이 좋아 이해 하는데 정말 많은 도움 도었습니다. 좋은포스팅 감사합니다!!!!!!😄

1개의 답글