알고리즘/CodeWars

[CodeWars] javascript - 6kyu : Will the present fit?

TLOWAC 2020. 7. 28. 00:52
기본적인 문제는 문제풀이 없이 Solution만 작성되어 있습니다.

 

Title

Will the present fit?

Description

Santa's elves are boxing presents, and they need your help! Write a function that takes two sequences of dimensions of the present and the box, respectively, and returns a Boolean based on whether or not the present will fit in the box provided. The box's walls are one unit thick, so be sure to take that in to account.

 

 

 [ Example Output ] 

  • Examples : Present and box respectively
[10, 7, 16]		, [13, 32, 10] --> true, box is bigger than present
[5, 7, 9]		, [9, 5, 7]    --> false, present and box are same size
[17, 22, 10]		, [5, 5, 10])  --> false, box is too small

 

How Can I Solved

문제 요구사항 정의

선물상자에 선물이 담길 수 있는지 구하여라.

 

문제 접근

 // => 결과값 : 선물상자에 선물을 넣을 수 있는지를 판단하여 True 또는 False 로 반환 

 // => 조건 1 . 상자는 두께가 1이다. 

    // => 상자 크기 :  [13, 32, 10]

    // => 담을수 있는 선물 크기 :  [12, 31,  9]

 

문제 풀이

 1. function 의 인자를 확인했다. 
function 의 첫번째 인자는 present 로 선물 크기 , function 의 두번째 인자는 box 로 상자 크기

function WillFit ( present , box ){
	. . .
}

 

 2. function 의 인자로 받은 값을 오름차순 ( ASC ) 으로 정렬해주었다. 

예제로 주어진 Data 를 통해서 Data 가 정렬된 값이 아닌 뒤죽박죽 섞인 값으로 넘어온다는 것을 확인했기 때문이며,
정렬을 해줌으로써 보다 쉬운 방법으로 문제를 풀어나갔다.

 

  •  배열에 담긴 문자를 정렬할때 : sort( )
  •  배열에 담긴 숫자를 정렬할때 ( ASC ) : sort( ( a, b ) => a - b )
  •  배열에 담긴 숫자를 정렬할때 ( DESC ) : sort( ( a, b ) => b - a )
function WillFit ( present , box ){
	let presentSize = present.sort((a,b)=> a-b)
	let boxSize= box.sort((a,b)=> a-b)
    . . .
}

 

 

 2 - 2. 하지만, 한가지 주의해야 할것이 있다. 

문제에는 아래와 같은 문구가 적혀있는데, 이 문구에서는 상자가 1 의 두께를 가지고 있다고 적혀있다.

The box's walls are one unit thick, so be sure to take that in to account.
( 상자의 벽은 두께가 1 단위이므로 반드시 고려해야합니다. )

만약 box 배열에 담긴 숫자들의 값에 각각 -1 을 해주지 않는다면,
 TestCase 는 통과해도 Attempt 에서 막히는 상황이 발생한다. 

TestCase 통과 , Attempt 실패 

 

이 상황은 기존에 작성한 코드에 map() 메서드를 사용함으로써 간단하게 해결 할 수 있다.

function WillFit ( present , box ){
	let presentSize = present.sort( ( a , b ) => a - b )
	//let boxSize= box.sort( ( a , b ) => a - b )			// => 수정 전
	let boxSize= box.map( v => v - 1  ).sort( ( a , b ) => a - b )		// => 수정 후
    . . .
}

 

 

 3. 이제 선물이 상자에 들어갈 수 있는지 확인하는 과정이 필요하다. 

presentSize 배열의 요소들과 boxSize 배열의 요소들을 비교한다.

  • boxSize 값이 presentSize 보다 큰 경우 true 를 반환한다. ( boxSize > presentSize )
  • boxSize 값이 presentSize 보다 작은 경우 false 를 반환한다. ( presentSize > boxSize )
  let result = presentSize.map((v,idx)=>{
    return boxSize[idx] > v ? true : false
  })

 

 

 

 4. 최종적으로 이 선물이 상자에 들어갈 수 있는지 판단한다. 

일련의 과정들을 통해 result 배열에는 Boolean 값의 요소들이 담겨져 있다.

  • result 배열에 false 가 하나라도 있는 경우 false 를 반환한다.
  • result 배열애 false 가 없는 경우 true 를 반환한다.
if(result.includes(false)){return false}
return true

Solution

function willFit(present, box){
  console.log('nonSortPresent : ',present)
  console.log('nonSortBox     : ',box)
  
  let presentSize = present.sort((a,b)=>a-b)
  let boxSize = box.map(v=>v-1).sort((a,b)=>a-b)
  // HaHa... You Must Be Consider that the box's walls are one unit thick 
  
  let result = presentSize.map((v,idx)=>{
    return boxSize[idx] > v ? true : false
  })
  
  console.log('sortPresentSize : ',presentSize)
  console.log('sortBoxSize     : ',boxSize)
  console.log(result)
  if(result.includes(false)){ return false }
  return true
}

 

글 읽어주셔서 감사합니다.

보다 유익한 컨텐츠를 제작할 수 있도록 노력하겠습니다.

-  작성자 이창훈 -

반응형