본문 바로가기
알고리즘/CodeWars

[CodeWars] javascript - 6kyu - Difference of 2 문제풀이

by TLOWAC 2020. 5. 6.

Title

Difference of 2

Description

The objective is to return all pairs of integers from a given array of integers that have a difference of 2.

The result array should be sorted in ascending order of values.

Assume there are no duplicate integers in the array. The order of the integers in the input array should not matter.

Examples

 

[1, 2, 3, 4]  should return [[1, 3], [2, 4]]

[4, 1, 2, 3]  should also return [[1, 3], [2, 4]]

[1, 23, 3, 4, 7] should return [[1, 3]]

[4, 3, 1, 5, 6] should return [[1, 3], [3, 5], [4, 6]

How Can I Solved문제 요구사항 정의

숫자가 담긴 배열이 함수의 인자값으로 주어진다.
배열의 원소값 중에서 '원소값 +2'한 값이 배열 안에 존재할 경우,
[원소값, 원소값+2] 의 형식으로 묶어서 반환한다.

반환값 예시

[]배열로 묶여서 반환되는 값은 여러개 일수도 있다.
[]배열로 묶여 있는 값들은 오름차순으로 정렬 되야한다.
( [[1,2]] => 가능 , [[2,1]] => 불가능)

[4, 1, 2, 3]  should also return [[1, 3], [2, 4]]

 

문제 접근

sort() , filter() 메서드를 활용하여 문제를 풀어 나갑니다.
filter() 메서드를 사용할때, 조건과 일치하는 값이 없으면 []빈 배열을 반환 합니다.
이런 점과 삼항 연산자를 활용하여 문제를 풀었습니다.

 

인자로 받은 배열을 오름차순으로 정렬하기

결과값으로 반환되는 값들이 오름차순으로 정렬되어 있기 때문에,
인자로 받은 input 배열을 정렬하여 풀이해나갑니다.

  input.sort((a,b)=>a-b)

 

배열의 원소값 중에서 '원소값+2'인 값만 뽑아내기

.filter() 메서드와 조건을 사용하면,
[] 배열의 원소중에서 특정 값만 뽑아낼 수 있습니다.
아래의 경우, input 배열 특정 인덱스의 원소값에 +2 한 값과 value값이 일치하는 경우만 뽑아 냅니다.

  input.filter(value=>value===input[i]+2)

 

filterValue

sort() , filter() 2가지 메서드를 '메서드 체이닝'을 이용합니다.
filterValue에 값을 저장하는 이유는 filter()의 경우 조건과 일치하는 값이 없는 경우
[ ]빈 배열을 반환하기 때문에 이를 이용하면, 로직을 좀 더 간편하게 작성 할 수 있기 때문입니다.

더불어 메서드 체이닝의 과정을 통해서 filterValue에 저장되는 값은
'+2'된 조건에 일치하는 값 입니다.

   filterValue = input.sort((a,b)=>a-b).filter(value=>value===input[i]+2)

 

삼항 연산자

앞서 말했듯, filter()는 조건과 일치하는 값이 없는 경우 [ ]빈 배열을 반환 합니다.

빈 배열의 length는 0 이며, 이를 삼항 연산자의 조건으로 사용합니다.

삼항연산자의 조건이 true인 경우(filterValue.length > 0),

result 배열에 [input 배열의 인덱스 i번째 값, filterValue 배열의 0번째 값] 를 push 합니다.

  filterValue.length>0 ?
  result.push([input[i],filterValue[0]]):
  ''

 

return result

result 배열에는 [ [ ], [ ], [ ] . . . ] 와 같은 형태
값이 차곡차곡 쌓이며, 최종적으로 result 배열을 반환하는 것으로 함수는 종료됩니다.

  return result

 

Solution

function twosDifference(input){
 //Enter your solution here
 var result=[]
 var filterValue = 0
 const length = input.length-1

 for(var i=0;i<length;i++){
   filterValue = input.sort((a,b)=>a-b).filter(value=>value===input[i]+2)

   filterValue.length>0 ?
   result.push([input[i],filterValue[0]]):
   ''
 }
  return result
}

 

Another Solution

.sort((a,b)=>a-b)

input 배열의 원소들을 오름차순으로 정렬

 

.filter(value=> input.indexOf(value+2) != -1)

input 배열의 각 원소를 순회하면서, indexOf(value+2)를 통해 각 원소의 값 +2 한 값이 input 배열에 존재하는 경우만

뽑아낸다.

 

.map(value=>[value, value+2])

.filter() 메서드를 거친 후에, input 배열에는 특정값만 남아있다.

.map() 메서드를 사용해서, [value, value+2]의 형태로 원소값을 변경한다.

이로써, input 배열은 [ [ ], [ ], . . . ]과 같은 형태를 띄게되며 이를 return 한다.

 

const twoDifference=(input)=>{
  return input
  .sort((a,b)=>a-b)
  .filter(value=> input.indexOf(value+2) != -1)
  .map(value=>[value,value+2])
}

댓글