문제
단일 문자들로 이루어진 배열 arr을 첫 번째이자 유일한 인수로 받는 JavaScript 함수를 작성해야 합니다.
이 배열에는 다음 네 가지 문자만 포함될 수 있습니다.
'N'→ 북쪽(North) 방향을 의미합니다.'S'→ 남쪽(South) 방향을 의미합니다.'W'→ 서쪽(West) 방향을 의미합니다.'E'→ 동쪽(East) 방향을 의미합니다.
각 문자는 해당 방향으로 단위 거리만큼 이동한다는 뜻입니다. 그리고 배열 안 어디에서든 서로 반대되는 두 방향, 즉 ('S'와 'N') 또는 ('E'와 'W')가 인접해 있으면 두 이동은 서로를 상쇄합니다. 따라서 우리가 만들 함수는 배열 전체의 최종 이동 방향을 계산해 반환해야 합니다.
예를 들어 함수에 다음과 같은 입력이 주어졌다고 가정해 보겠습니다.
입력
const arr = ['N', 'S', 'S', 'E', 'W', 'N', 'W'];
출력
const output = 'W';
출력 설명
먼저 'N'과 'S'가 서로 상쇄되고, 이어서 'E'와 'W'도 서로 상쇄됩니다. 그 후 남아 있던 'N'과 'S'가 한 번 더 상쇄되면서 최종적으로 'W' 하나만 남게 됩니다.
예제 코드
다음은 위 문제를 해결하는 코드입니다.
const arr = ['N', 'S', 'S', 'E', 'W', 'N', 'W'];
const cancelDirections = (arr = []) => {
let str = arr.join('');
while(str.includes('NS') || str.includes('SN') || str.includes('EW') || str.includes('WE')){
str = str.replace('NS', '');
str = str.replace('SN', '');
str = str.replace('EW', '');
str = str.replace('WE', '');
};
return str.split('');
};
console.log(cancelDirections(arr));코드 동작 원리
이 코드는 다음 단계로 동작합니다.
arr.join('')으로 배열을 하나의 문자열로 합칩니다.while반복문을 사용해 문자열에 서로 반대되는 방향 쌍('NS', 'SN', 'EW', 'WE')이 존재하는지 확인합니다.replace()메서드는 기본적으로 첫 번째로 발견된 패턴만 제거하므로, 상쇄 가능한 모든 쌍이 사라질 때까지 반복문을 계속 실행합니다.- 더 이상 상쇄할 쌍이 없으면
split('')으로 문자열을 다시 배열로 변환해 반환합니다.
출력 결과
['W']