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

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

by TLOWAC 2020. 7. 28.
기본적인 문제는 문제풀이 없이 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
}

 

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

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

-  작성자 이창훈 -

댓글