ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeKata] 프로그래머스: 11.14(일), 외벽 점검
    Algorithm 2021. 11. 14. 19:17
    반응형

    🥋 Oooth More!! (Level 3) 

     

    🧮 풀이

    weak 배열을 2바퀴로 돌려서 생각하는 방법까진 접근했으나, 구체적인 풀이를 모범답안을 통해 공부했다.

     

    🖇 리뷰

    function solution (n, weak, dist) {
      const len = weak.length;
      const linear_weak = new Array(len*2 - 1).fill(0);
      
      for(let i = 0; i < len*2-1; i++)
        linear_weak[i] = i < len ? weak[i] : weak[i-len] + n;
      
      dist.sort((a, b) => b-a);
      
      for(let i = 1; i <= dist.length; i++) {
        const permutation = getPermutation(dist, i);
        
        for(const permu of permutation) {
          for(let j = 0; j < len; j++) {
            let line = linear_weak.slice(j, len+j);
            for(const p of permu) {
              const coverage = line[0] + p;
              line = line.filter(e => e > coverage);
              if(!line.length) return i;
            }
          }
        }
      }
      
      return -1;
    }
    
    const getPermutation = (arr, n) => {
      if(n === 1) return arr.map(el => [el]);
      const result = [];
      
      arr.forEach((fixed, idx, origin) => {
        const rest = [...origin.slice(0, idx), ...origin.slice(idx+1)];
        const perms = getPermutation(rest, n-1);
        const attached = perms.map(perm => [fixed, ...perm]);
        result.push(...attached);
      });
      
      return result;
    }

    * 출처 : https://velog.io/@longroadhome/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LV.3-%EC%99%B8%EB%B2%BD%EC%A0%90%EA%B2%80-JS

     

    1. getPermutation() 함수 : 최소투입인원 순열 반환

    • 이 함수는, 인자로 arr(dist 목록), n(몇 명) 2개를 받는다. dist 친구들 중, n명을 사용하는 모든 순열을 반환하는 함수이다.
    • n이 1이라면 각 친구들이 담긴 배열을, 2 이상이면 모든 순열의 경우의 수를 담은 배열을 2중배열 형태로 반환해준다.

     

    2. solution() 풀이

    • len은 weak의 길이이며, dist는 한번에 갈 수 있는 거리가 긴 친구부터 체크하는게 용이하므로 sort()로 내림차순을 적용한다.
    • linear_weak반시계까지 계산할 수 있도록, 1부터 n 사이에 있는 요소들을 e와 e+n 두바퀴로 재구성한 배열이다. (가령, case1의 [1, 5, 6, 10] 은, n이 12이므로 [1, 5, 6, 10, 13, 17, 18] 이 된다. 마지막 요소는 시계방향 2바퀴가 반복되므로 e+n 추가시 제외)
      • 첫 반복문은, dist 친구들의 최소인원 수를 순회한다. 최초 1명에서, 최대 dist.length(전체) 명만큼 순회하며, 해당 인원의 친구 조합목록인 permutationgetPermutation() 함수로 계산한다.
      • 두 번째 반복문은, permutation의 모든 케이스(permu)를 순회한다.
      • 세 번째 반복문은, linear_weak의 모든 회전경우를 계산하는 함수이다. 0번째부터 마지막인 len번째까지, 원래길이인 len만큼 잘라준다.
      • 네 번째 반복문은, permu의 각 친구가 갈 수 있는 거리(p)를 계산한다. coverage는 시작점(line[0])부터 p만큼 갈 수 있는 거리값으로, line은 이 coverage가 갈 수 있는 범위외로 filter() 된다.
      • 만약, 여기서 line이 남는다면 다음 p의 경우를 계산하고, 없다면 모든 weak을 커버한 것으로 dist 친구명수인 i를 정답으로 반환한다.
    • line이 계속 남아있어 i를 반환하지 못했다면, 결국 불가한 경우로 이 땐 -1을 반환하면 된다.
    반응형
Designed by Tistory.