[CodingTest] 2019 카카오 신입 공채 1차 - 4번 무지의 먹방 라이브 문제 with Javascript


무지의 먹방 라이브


나의 답안

function solution(food_times, k) {
    if(food_times.length > k) return k+1

    const val = k / food_times.length,
          rest = k % food_times.length,
          timesSum = food_times.reduce((a, b) => a + b);
    
    if(timesSum <= k) return -1;
    
    let count = 0;
    for(let i=0;timesSum>i;i++) {
        const idx = i%food_times.length
        if(food_times[idx] > 0) {
            food_times[idx]--
            count++;
            if(count == k) return (food_times.length < idx+2 ? idx+2 - food_times.length : idx+2);
        }
    }
}

결과

접근방식 및 아쉬웠던 점.

좋은 참고 사이트 : 참고사이트 Brute Force 문제였다. Object Array로 풀수있는 방법 중 좋은 방식을 생각하지 못했다. 루프를 진행하며 제외할수 있는 값을 계속 고려해서 루프를 돌았다. 그래서 불필요한 로직이 생겨버렸다.

내 정답들의 풀이 골격은 모두 다 해보는 Brute Force 알고리즘이다. 하지만 이렇게 하면 효율성 점수를 얻을 수 없다.

  1. food_times 배열을 값과 인덱스로 Object Array을 만들고
  2. 각 줄마다 값이 있는 것들만 측정해서 k값을 지워나가고
  3. k값이 0보다 클때 -1을 진행한다고 k=0이면 다음 요소로 넘어간다.

최고의 파이썬 답안

def solution(food_times, k):
    if sum(food_times) <= k: return -1
    if len(food_times) > k: return k+1
    n = len(food_times)
    for i in range(n):
        food_times[i] = [food_times[i],i+1]
    ft = sorted(food_times,key=lambda x:x[0]) # 내림차순 정렬
    i,r=0,0
    while True:
        if k - (n-i)*(ft[i][0]-r) < 0:
            break
        else:
            k -= (n-i)*(ft[i][0]-r)
            r += (ft[i][0]-r)
            i += 1
    ft = sorted(ft[i:n], key = lambda x: x[1])
    return ft[k%len(ft)][1]

결과

주요 로직 설명

  • food_times를 내림차순으로 정렬하여 가장 먼저 다 먹을 음식들 기준으로 정렬한다. => ft
  • ft를 순회하며(i += 1) 해당 시간만큼 남은 시간을 k(정전된시간)에 지속적으로 뺴준다. => k -= (n-i)*(ft[i][0]-r)
  • r에는 축적되는 시간을 계속 저장해둔다. => r += (ft[i][0]-r)


파이썬 답안을 보고 수정한 자바스크립트 답안

function solution(food_times, k) {
    if(food_times.length > k) return k+1;
    if( food_times.reduce((a, b) => a + b) <= k ) return -1;

    const n = food_times.length;

    for(let i=0;n>i;i++) {
        food_times[i] = [food_times[i],i+1];
    }
    let ft = food_times.sort((a, b) => a[0] - b[0]), // 내림차순 정렬
        i = 0,
        r = 0;
    while(true) {
        if( k-(n-i)*(ft[i][0]-r) < 0 ) break;
        else {
            k -= (n-i)*(ft[i][0]-r);
            r += ft[i][0]-r;
            i += 1;
        }
    }
    ft = food_times.slice(i,n).sort((a, b) => a[1] - b[1]);
    return ft[k%ft.length][1];
}

결과


좋은 자바스크립트 답안

function solution(food_times, k) {
  let copy = [],
      total = 0;
  for (let i = 0; i < food_times.length; i++) {
    total += food_times[i];
    copy[i] = { val: food_times[i], index: i + 1 };
  }

  if (total <= k) return -1;

  copy.sort((a, b) => {
    if (a.val === b.val) a.index - b.index;
    return a.val - b.val;
  });

  let sum = 0;
  let sub = 0;

  for (let i = 0; i < copy.length; i++) {
    sub = (copy[i].val - sum) * (copy.length - i);
    if (k - sub >= 0) {
      sum += copy[i].val - sum;
      k -= sub;
    } else {
      let temp = Math.floor(k / (copy.length - i));
      k -= temp * (copy.length - i);
      sum += temp;
      break;
    }
  }

  copy = copy.filter(item => item.val - sum > 0);
  copy.sort((a, b) => a.index - b.index;);

  return copy[k].index;
}




2023

Flutter 맛보기 1

3 분 소요

직방 기술지원팀 기술공유 세미나 중 플러터를 소개한 내용입니다

Back to Top ↑

2022

Back to Top ↑

2019

[Tutorial] Storybook과 Bit을 활용한 UI 컴포넌트 관리(Workflow)

1 분 소요

회사에서 프론트엔드 개발원칙을 SFC(Single File Component)에서 UI 컴포넌트를 기준으로 CDD(Component Driven Development)를 진행하려고 한다. 그래서 체계적으로 관리하기위해 Storybook과 Bit을 도입해보고자 한다. 각각의 역할은 ...

[Workflow] 프론트엔드 개발조직을 위한 워크플로 설계

2 분 소요

작성 배경 회사의 작업구조를 페이지 중심 개발에서 UI 컴포넌트 중심 개발로 변경하면서 Workflow를 개선할만한 환경을 구성해야했다. 폐쇄망 기반에서 개발자간 UI 명세서 역할을 할 수 있는 Storybook과 그것을 공유할 Verdaccio라는 구축형 NPM Pri...

[ESlint & Prettier] 개발 관습 설정 in Visual Studio

1 분 소요

회사 프로젝트를 작업하기 전 프론트엔드 개발자들 간의 코드 규칙을 Eslint와 Prettier 설정을 맞춰 관리해가는 방향을 정했다. 아직 협업을 할 경우는 없지만 미래에 인수인계 받거나 협업을 진행할 경우 코드관습이 달라 고생할 경우를 대비하기로 했다. 설정은 작업을 진행하며 ...

[CodingTest] 2019-10-26 SQL문제

최대 1 분 소요

공부겸 코딩테스트 사이트에서 토요일 오전 10시에 백엔드 포지션 테스트를 해준다기에 참여해봤다. SQL문제가 나왔는데 더 좋은 답이 있는것 같아 나중에 기록해두고 수정해보기로 한다.

[CodingTest] 피보나치 수열

1 분 소요

문제 : 피보나치 수열 제 1항부터 입력한 자연수(N)까지의 피보나치 수열 항들의 합을 구하여라.

[Syntax] 새로 알게된 파이썬 문법 정리

최대 1 분 소요

chaning comparison 파이썬은 chaning comparison이라는 신기한 문법이 있다. 참고 if a < b and b < c : (...) 라는 구문이 if a < b < c : (...) 으로 연산된다. 직관적인 문법이 인상적. ...

[DataType] Map & Set

최대 1 분 소요

Set vs Array - 관련기사 Set 유일값들의 배열이 필요할때(distinct) 집합의 개념이 필요할때(차집합, 교집합 등등 자체 메서드들이 많음.) index가 필요 없을때 Array에서 중복값을 없앨때 => ...

Back to Top ↑

2018

SGIS-shpToGeojson

1 분 소요

SGIS에서 받은 지도데이터(.shp)를 geojson으로 변경하는 작업 내용

Back to Top ↑