Directions Reduction

이조은·2020년 12월 4일
0

Code Kata

목록 보기
5/15

Directions Reduction 문제 확인하기

문제

배열 안에 반대하는 방향이 이어서 등장한다면 그 요소들을 제거할 수 있다. 예를 들어 북쪽으로 한 걸음 가고, 바로 남쪽으로 한 걸음 간다면 제자리이기 때문. 이 규칙에 따라 제거할 요소들을 삭제한 결과를 리턴해야 한다.

For example: 

  ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH",     "WEST"] // => returns ["WEST"]
  or
  { "NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST" }; // => returns { "WEST" }
  or
  [North, South, South, East, West, North, West] // => returns [West]
  
  ["NORTH", "WEST", "SOUTH", "EAST"] // => returns ["NORTH", "WEST", "SOUTH", "EAST"]

나의 풀이

🙆🏻‍♀️ 첫 번째 풀이

복잡해 보여서 포기하려 했는데 천천히 살펴보니 별거 아니였다.. 훗..

일단 처음 보고 배열의 요소를 하나하나 살펴보아야 하기 때문에 loop을 써야겠다고 생각했다. 한번 반복으로 끝내는 것이 아니라 배열에 원하는 조건이 없을 때까지 반복해야 하므로 while loop을 사용했다.

두 개의 반대되는 방향이 붙어있을 경우에 splice로 그 요소들을 없애고 인덱스 넘버(i)를 처음으로 되돌렸다. 배열의 끝까지 요소들을 살펴보고 원하는 조건이 없을 때는 인덱스 넘버를 하나씩 증가시켰다.

function dirReduc(arr){
  // arr.splice(start, 제거할 요소수)
  let i = 0;
  while(i < arr.length) {
    if(arr[i]==="NORTH" && arr[i+1]==="SOUTH" ||
       arr[i]==="SOUTH" && arr[i+1]==="NORTH" ||
       arr[i]==="EAST" && arr[i+1]==="WEST" ||
       arr[i]==="WEST" && arr[i+1]==="EAST") {
      arr.splice(i,2)
      i=0;
    }
    else {
      i++
    }
  }
  return arr
}

모범 답안

☝️ 첫 번째 모범 답안

function dirReduc(plan) {
  var opposite = {
    'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'};
  return plan.reduce(function(dirs, dir){
      if (dirs[dirs.length - 1] === opposite[dir])
        dirs.pop();
      else
        dirs.push(dir);
      return dirs;
    }, []);
}

✔️ 짝지어야할 두 단어를 key와 value로 만들어 객체로 할당했다.
✔️ 연산이 마무리 되고 한 가지 배열이 나와야 하므로 reduce 메소드를 사용했다.
EX) arr.reduce(callback( accumulator, currentValue, [, index[, array]] )[, initialValue])
✔️ 축적이 되는 배열(dirs)을 만들게 되는데 그 배열의 마지막 요소(dirs[dirs.length - 1])가 현재 요소(dir)에 대응하는 밸류와 일치하면 삭제한다.

profile
싱글벙글

0개의 댓글