dirReduc.js

Codewars 알고리즘 풀이


Problem

  • Write a function which will take an array of strings and returns an array of strings with the needless directions removed.
    • 불필요한 방향이 제거된 문자열 배열을 반환한다.



Solution 01

function dirReduc(arr) {
  let count = 0;
  
  for (let i = 0; i < arr.length; i++) {
    if (
      arr[i] === 'EAST' && arr[i + 1] === 'WEST' ||
      arr[i] === 'WEST' && arr[i + 1] === 'EAST' ||
      arr[i] === 'NORTH' && arr[i + 1] === 'SOUTH' ||
      arr[i] === 'SOUTH' && arr[i + 1] === 'NORTH'
    ) {
      arr.splice(i, 2);
      count++;
      i--;
    }
  }
  return count === 0 ? arr : dirReduc(arr);
}

dirReduc(['NORTH', 'SOUTH']);                  // []
dirReduc(['NORTH', 'SOUTH', 'EAST', 'WEST']);  // []
dirReduc(['NORTH', 'WEST', 'SOUTH', 'EAST']);  // ['NORTH', 'WEST', 'SOUTH', 'EAST']
dirReduc(['NORTH', 'SOUTH', 'EAST']);          // ['EAST']


Solution 02

function dirReduc(arr) {
  const opposite = {
    EAST: 'WEST',
    WEST: 'EAST',
    NORTH: 'SOUTH',
    SOUTH: 'NORTH'
  };
  
  return arr.reduce((result, i) => {
    if (result[result.length - 1] === opposite[i]) {
      result.pop();
    } else {
      result.push(i);
    }
    return result;
  }, []);
}

dirReduc(['NORTH', 'SOUTH']);                  // []
dirReduc(['NORTH', 'SOUTH', 'EAST', 'WEST']);  // []
dirReduc(['NORTH', 'WEST', 'SOUTH', 'EAST']);  // ['NORTH', 'WEST', 'SOUTH', 'EAST']
dirReduc(['NORTH', 'SOUTH', 'EAST']);          // ['EAST']


Solution 03

function dirReduc(arr) {
  const opposite = {
    EAST: 'WEST',
    WEST: 'EAST',
    NORTH: 'SOUTH',
    SOUTH: 'NORTH'
  };
  
  return arr.reduce((result, i, index) => {
    opposite[result.slice(-1)] === i ? result.pop() : result.push(i);
    return result;
  }, []);
}

dirReduc(['NORTH', 'SOUTH']);                  // []
dirReduc(['NORTH', 'SOUTH', 'EAST', 'WEST']);  // []
dirReduc(['NORTH', 'WEST', 'SOUTH', 'EAST']);  // ['NORTH', 'WEST', 'SOUTH', 'EAST']
dirReduc(['NORTH', 'SOUTH', 'EAST']);          // ['EAST']