Directions Reduction

Codewars Link

문제

Once upon a time, on a way through the old wild west,…

… a man was given directions to go from one point to another. The directions were "NORTH", "SOUTH", "WEST", "EAST". Clearly "NORTH" and "SOUTH" are opposite, "WEST" and "EAST" too. Going to one direction and coming back the opposite direction is a needless effort. Since this is the wild west, with dreadfull weather and not much water, it's important to save yourself some energy, otherwise you might die of thirst!

How I crossed the desert the smart way.

The directions given to the man are, for example, the following:

["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]

You can immediatly see that going "NORTH" and then "SOUTH" is not reasonable, better stay to the same place! So the task is to give to the man a simplified version of the plan. A better plan in this case is simply:

["WEST"]

Other examples:

In["NORTH", "SOUTH", "EAST", "WEST"], the direction "NORTH" + "SOUTH" is going north and coming back right away. What a waste of time! Better to do nothing.

The path becomes ["EAST", "WEST"], now "EAST" and "WEST" annihilate each other, therefore, the final result is [] .

In ["NORTH", "EAST", "WEST", "SOUTH", "WEST", "WEST"], "NORTH" and "SOUTH" are not directly opposite but they become directly opposite after the reduction of "EAST" and "WEST" so the whole path is reducible to ["WEST", "WEST"].

Task

Write a function dirReduc which will take an array of strings and returns an array of strings with the needless directions removed (W<->E or S<->N side by side).

The Haskell version takes a list of directions with data Direction = North | East | West | South. The Clojure version returns nil when the path is reduced to nothing. The Rust version takes a slice of enum Direction {NORTH, SOUTH, EAST, WEST}.

Examples

dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]) => ["WEST"]
dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH"]) => []

Note

Not all paths can be made simpler. The path ["NORTH", "WEST", "SOUTH", "EAST"] is not reducible. "NORTH" and "WEST", "WEST" and "SOUTH", "SOUTH" and "EAST" are not directly opposite of each other and can't become such. Hence the result path is itself : ["NORTH", "WEST", "SOUTH", "EAST"].

문제 이해

문제 μ„€λͺ…이 맀우 μΉœμ ˆν•˜λ‹€.

배열을 μ­‰ ν›‘λŠ”λ° "WEST" <-> "EAST", NORTH<->SOUTHκ°€ 겹치면 두 μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. 그리고 λ‹€μ‹œ μ²˜μŒλΆ€ν„° μ²΄ν¬ν•΄μ„œ μ œκ±°ν•˜κ³  λ‹€μ‹œ μ²˜μŒλΆ€ν„° μ²΄ν¬ν•΄μ„œ 또 μ œκ±°ν•œλ‹€.

그리고 μ΅œμ’… 남은 μš”μ†Œλ₯Ό return ν•œλ‹€.

ν•΄κ²° 방법

  1. λ™μ„œλ‚¨λΆμ„ 담은 배열을 λ§Œλ“ λ‹€.

  2. λ°°μ—΄ μš”μ†Œ ν•˜λ‚˜ν•˜λ‚˜μ— μ ‘κ·Όν•œλ‹€.

  3. λ°°μ—΄μš”μ†Œμ™€ λ™μ„œλ‚¨λΆμ„ 담은 λ°°μ—΄κ³Ό λ§€μΉ˜ν•΄ κ·Έ λ‹€μŒ μš”μ†Œλ‘œ 였면 μ•ˆλ˜λŠ”κ²Œ μžˆλŠ” μ§€ ν™•μΈν•œλ‹€.

  4. μžˆλ‹€λ©΄ ν˜„μž¬ μš”μ†Œμ™€ λ‹€μŒ μš”μ†Œλ₯Ό μ‚­μ œν•œλ‹€.

  5. λ‹€μ‹œ 2둜 λŒμ•„κ°„λ‹€.

  6. κ²ΉμΉ˜λŠ” μš”μ†Œκ°€ μ—†λ‹€λ©΄ return ν•œλ‹€.

μ½”λ“œ κ΅¬ν˜„

function dirReduc(arr) {
  const compass = ["NORTH", "SOUTH", "WEST", "EAST"];

  arr.map((dir, idx) => {
    let MatchIdx = compass.findIndex(ele => {
      return dir === ele;
    });

    let comIdx = MatchIdx % 2 ? MatchIdx - 1 : MatchIdx + 1;

    if (arr[idx + 1] === compass[comIdx]) {
      arr.splice(idx, 2);
      dirReduc(arr);
    };
  });

  return arr;
}

κ²°κ³Ό 뢄석

random ν…ŒμŠ€νŠΈ 톡과

Unnamed, Meow, Quantumke, JeffP6, jmcilhargey, Dimzdey's Solution

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;
  }, []);
}

λ³€μˆ˜λͺ…이 λ§ˆμŒμ— λ“ λ‹€. opposite else도 ν•œμ€„λ‘œ μ“Έ 수 μžˆκ΅¬λ‚˜.

opposite 객체둜 λ§Œλ“ κ²Œ 훨씬 κΉ”λ”ν•˜κ³  가독성이 μ’‹λ‹€.

pop()은 λ°°μ—΄μ—μ„œ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό 제거 ν•œλ‹€.

λ‚΄ μ½”λ“œμ˜ 단점은

  1. ν™•μΈν•œ μš”μ†Œλ₯Ό λ‹€μ‹œ μ²˜μŒλΆ€ν„° 확인해야 ν•œλ‹€.

  2. μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν–ˆκΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ 배열에 담을 수 μ—†λ‹€.

λ₯Ό λ‹¨μ μœΌλ‘œ κ°€μ‘ŒλŠ”λ° 이 solution에선 μ΄λŸ¬ν•œ 점이 λ³΄μ•ˆλ˜μ–΄μžˆλ‹€.

배열을 κ²€μˆ˜ν•˜λŠ” 일을 reduceλ₯Ό μ‚¬μš©ν•΄ μƒˆλ‘œμš΄ 배열을 λ§Œλ“€μ—ˆλ‹€.

dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH"]) => []

λ§Œμ•½ μ΄λŸ°μ˜ˆμ‹œκ°€ μžˆλ‹€λ©΄,

  1. μ΄μ „μš”μ†Œκ°€ μ—†κΈ° λ•Œλ¬Έμ— 맨처음 dirsμ—λŠ” "NORTH"κ°€ λ‹΄κΈ΄λ‹€.

  2. dirs의 λ§ˆμ§€λ§‰ μš”μ†Œμ™€ λ°°μ—΄μ˜ ν˜„μž¬μš”μ†Œμ™€ 비ꡐ

    1. "NORTH" === opposite["SOUTH"] λŠ” κ°™λ‹€

    2. dirsμ—μ„œ "NORTH"λŠ” 제거 λœλ‹€.

  3. μ΄μ „μš”μ†Œκ°€ μ—†κΈ° λ•Œλ¬Έμ— "SOUTH"κ°€ λ‹΄κΈ΄λ‹€.

  4. "SOUTH" === opposite["EAST"] λŠ” κ°™μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— "EAST"λŠ” dirs에 λ‹΄κΈ΄λ‹€.

  5. "EAST" === opposite["WEST"] 와 κ°™κΈ° λ•Œλ¬Έμ— dirsμ—μ„œ "EAST"λŠ” 제거 λœλ‹€.

  6. dirsλ°°μ—΄μ—” "SOUTH"만 λ‚¨λŠ”λ‹€.

  7. "SOUTH" === opposite["NORTH"] κ°™κΈ° λ•Œλ¬Έμ— "SOUTH" 제거 λœλ‹€.

  8. 빈 λ°°μ—΄λ§Œ return ν•œλ‹€.

λ‚΄κ°€ μ§  μ½”λ“œλŠ” ν˜„μž¬μš”μ†Œμ™€ λ‹€μŒμš”μ†Œλ§Œμ„ λΉ„κ΅ν•˜μ—¬ μ œκ±°ν–ˆκΈ° λ•Œλ¬Έμ— κ²€μˆ˜κ°€ μ™„λ²½ν•˜λ‹€κ³  ν•  수 μ—†λ‹€. μ΄μ „μš”μ†Œκ°€ μƒˆλ‘œμš΄ ν™˜κ²½μ΄ 될 수 μžˆλŠ” κ°€λŠ₯성에 μ²˜μŒλΆ€ν„° λ‹€μ‹œ 배열을 κ²€μˆ˜ ν–ˆλ‹€.

ν•˜μ§€λ§Œ 이 μ½”λ“œλŠ” μ΄μ „μš”μ†Œμ™€ ν˜„μž¬ μš”μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ μ΄μ „μš”μ†Œλ₯Ό μ‚­μ œν•˜κΈ° λ•Œλ¬Έμ— μ΄μ „μš”μ†Œκ°€ μƒˆλ‘œμš΄ ν™˜κ²½μ— λ”°λ₯Έ 상황에 훨씬 λŒ€μ‘ν•˜κΈ° νŽΈν•œ μ½”λ“œμ΄λ‹€.

js파일보기

Last updated

Was this helpful?