ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기능개발_2LV_스택/큐(Python/JavaScript)
    프로그래머스 문제풀이 2021. 6. 26. 12:53
    728x90

    Python 풀이

    하루에 완성되는 개발을 고려내기 위해 Time 변수를 어떻게 사용햇는지

    주목하자!!!

    from collections import deque
    """ Time 을 이용한 조건문 구성하기"""
    def solution(progresses, speeds):
        answer = []
        p = deque(progresses)
        s = deque(speeds)
        time = 0
        count = 0
        
        while p:
            # print(f'1 : P : {p}, tiem : {time} , Count : {count}')
            if p[0] + time * s[0] >= 100:
                # print(f'22 : P : {p}, tiem : {time} , Count : {count}')
                p.popleft()
                s.popleft()
                count +=1
            else:
                if count == 0:
                    # print(f'333 : P : {p}, tiem : {time} , Count : {count}')
                    time +=1
                else:
                    # print(f'4444: P : {p}, tiem : {time} , Count : {count}')
                    answer.append(count)
                    count = 0
        
        answer.append(count)
                
        return answer
    from collections import deque
    """ Time 을 이용한 조건문 구성하기"""
    def solution(progresses, speeds):
        answer = []
        p = deque(progresses)
        s = deque(speeds)
        time = 0
        count = 0
        
        while p:
            if p[0] + time * s[0] >= 100:
                p.popleft()
                s.popleft()
                count +=1
            else:
                if count == 0:
                    time +=1
                else:
                    answer.append(count)
                    count = 0
        
        answer.append(count)
                
        return answer


    Javascript

    function solution(progresses, speeds) {
        let answer = [];
        let time = 0
        let count = 0
     
        while (progresses[0]) {
            if (progresses[0] + (time * speeds[0]) >= 100){
                progresses.shift()
                speeds.shift()
                count += 1
            } else {
                if (count === 0){
                    time += 1
                } else {
                    answer.push(count)
                    count = 0
                }
            }
        }
        answer.push(count)
        return answer;
    }

     

     


    Javascript (함수형 프로그래밍)

    function* range(start = 0, stop = start, step = 1) {
      if (arguments.length === 1) start = 0;
      if (arguments.length < 3 && start > stop) step *= -1;
    
      if (start < stop) {
        while (start < stop) {
          yield start;
          start += step;
        }
      } else {
        while (start > stop) {
          yield start;
          start += step;
        }
      }
    }
    
    function map(f) {
      return function* (iter) {
        for (const a of iter) yield f(a);
      }
    }
    
    function filter(f) {
      return function* (iter) {
        for (const a of iter) if (f(a)) yield a;
      }
    }
    
    function take(limit) {
      return function* (iter) {
        for (const a of iter) {
          yield a;
          if (--limit === 0) break;
        }
      }
    }
    
    function reduce(f) {
      return function (acc, iter) {
        if (!iter) acc = (iter = acc[Symbol.iterator]()).next().value;
        for (const a of iter) acc = f(acc, a);
        return acc;
      }
    }
    
    function each(f) {
      return function(iter) {
        for (const a of iter) f(a);
        return iter;
      }
    }
    
    function go(arg, ...fs) {
      return reduce((arg, f) => f(arg))(arg, fs);
    }
    
    const head = ([a]) => a;
    
    const find = (f) => (iter) => head(filter(f)(iter));
    
    function inc(parent, k) {
      parent[k] ? parent[k]++ : (parent[k] = 1);
      return parent;
    }
    
    const countBy = (f) => (iter) =>
      reduce((counts, a) => inc(counts, f(a)))({}, iter);
    
    const identity = a => a;
    
    const count = countBy(identity);
    
    const groupBy = (f) => (iter) =>
      reduce(
        (group, a, k = f(a)) => ((group[k] = (group[k] || [])).push(a), group)
      )({}, iter);
    
    function* entries(obj) {
      for (const k in obj) yield [k, obj[k]];
    }
    
    function* values(obj) {
      for (const k in obj) yield obj[k];
    }
    
    const isFlatable = a =>
      a != null && !!a[Symbol.iterator] && typeof a !== 'string';
    
    function* flat(iter) {
      for (const a of iter) isFlatable(a) ? yield* a : yield a;
    }
    
    function zip(a) {
      return function* (b) {
        a = a[Symbol.iterator]();
        b = b[Symbol.iterator]();
        while (true) {
          const { value, done } = a.next();
          const { value: value2, done: done2 } = b.next();
          if (done && done2) break;
          yield [value, value2];
        }
      }
    }
    
    function concat(...args) {
      return flat(args);
    }
    
    const dayCount = periods =>
        reduce(([counts, total_period], period) =>
            total_period < period
                ? [inc(counts, counts.length), period]
                : [inc(counts, counts.length-1), total_period])([[], 0], periods);
    
    function solution(progresses, speeds) {
        /*
        zip 을 이용해 작업의 진도와 개발 속도를 문제를 편하게 해결하기 위해
        [93, 1], [30, 30] , [55, 5] 과 같이 만들어줌 이때, zip은 well foremd iterator를 반환
    
        map 을 이용해 작업일을 계산하여 배열로 변경함.
        이때 Math.ceil 로 결과값을 올려 정수로 받음.
        
        dayCount 함수에서 작업일 배열을 받아, 
        reduce로 배포일 배열을 만듬 2차원 배열의 식에 이용되는 마지막 요소를 제외한
        첫번째 배열을 head로 출력.  
        [ [ 2, 1 ], 9 ]
        */
    
        return go(
            zip(progresses)(speeds),
            map(([progress, speed]) => Math.ceil((100 - progress) / speed)),
            dayCount,
            head
        ) 
    }

     

    728x90

    '프로그래머스 문제풀이' 카테고리의 다른 글

    가장 큰 수_정렬_Javascirpt  (0) 2021.08.08
    완주하지 못한 선수(Python, Js)  (0) 2021.06.22
    힙_이중우선순위큐_Python  (0) 2021.06.16
    정렬_H Index_Python  (0) 2021.06.13
    힙_디스크 컨트롤러_Python  (1) 2021.06.12
Designed by Tistory.