프로그래머스 js 카펫

이명진·2022년 11월 24일
0

코드카타

목록 보기
51/69

문제 해설

leo는 카펫을 사러갔다 카펫은 가운데가 노랑 테두리가 갈색인데 레오는 특이하게 넓이는 안구하고
갈색의 개수와 노랑의 개수를 기억하고 왔다. 테두리의 개수 갈색과 중앙의 개수 노랑이 주어질때
카펫의 가로 세로를 구하면 된다.

문제 풀이

문제는 완전탐색 문제였는데 다르게 풀었다. 몇개의 테스트 케이스를 확인해보니
갈색과 노란색을 더한값의 공배수를 찾으면 답이 나오길래 이런 방식으로 문제를 풀었다.

첫번째 풀이

function solution(brown, yellow) {
    let answer = [];
  	answer = brown+yellow
  let arr = [];
  	for(let i=2; i<answer;i++){
      if(answer%i==0){
        arr.push(i)
      }
    }
  // console.log(arr)
  let width = arr.length/2>1?arr[arr.length/2 -1]:arr[0]
  let height = answer/width
  	return height<=width?[width,height]:[height,width]
}

공배수를 구해서 arr에 담아주고 width와 height를 구해서 배열로 리턴해주었다.
이러니 5문제 정도가 틀렸다. 1번부터 틀려서 뭐가 문제일지 확인해보다가
질문하기에서 1번문제를 틀릴때의 경우를 말해주었다.
적용해보니 width의 arr.lenth/2 이 부분에서 소수점으로 나올때가 있다는 것을 처리해주지 못하였다.

두번째 풀이

function solution(brown, yellow) {
    let answer = [];
  	answer = brown+yellow
  let arr = [];
  	for(let i=2; i<answer;i++){
      if(answer%i==0){
        arr.push(i)
      }
    }
  // console.log(arr)
  let width = arr.length/2>1?arr[Math.ceil(arr.length/2 -1)]:arr[0]
  let height = answer/width
  	return height<=width?[width,height]:[height,width]
}

첫번째 풀이에서의 코드를 약간 수정했다. width에서 올림처리 해주었다.

그랬더니 1번은 맞췄지만 나머지 4,6,7이 문제였다.

뭐가 문제일까 다시 질문하기를 둘러보니
4,6,7 틀린 사람들을 위해 친절한 분이 힌트를 주어서 적용하게 되었다.

세번째 풀이

function solution(brown, yellow) {
    let answer = [];
  	answer = brown+yellow
  let arr = [];
  	for(let i=2; i<answer;i++){
      if(answer%i==0){
        arr.push(i)
      }
    }
  // console.log(arr,answer)
  for(let j=0;j<arr.length;j++){
    let height = arr[j];
    let width = answer/height
    if(((width-2)*(height-2))===yellow){
      answer = [width,height]
      break;
     
    }
  }
  
  return answer

}

이번에는 힌트를 받아서 코드를 조금 수정했다.
TC 4,6,7을 통과하려면 (x-2)(y-2)==yellow를 검증해야 한다고 한다.
왜 검증을 해야 하는지 잘모르겠지만 확실히 그분의 글을 읽어보니 나랑 같은 상황이어서
아예 검증을 넣고 코드를 풀어버리니 문제가 풀렸다.
끈기가 대단하신 분이고 멋있는 분을 통해서 문제를 풀수 있었다.

다른사람의 풀이

(x-2)(y-2)==yellow를 검증을 한것이 1위를 하고 있었다.
나머지 것들을 둘러보니 왜 이렇게 풀어야 되는지 모르는 것들이 많이 있었다.
공식이 있는건가? 생각이 들었다.

두번째 코드이다

function solution(brown, yellow) {
    const x = (brown - 12) * 0.5;
    const y = yellow - brown + 8;
    const i = ( 8 + x + Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
    const j = ( 8 + x - Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
    console.log(i)


    var answer = [i, j];
    return answer;
}

왜 이렇게 풀었는지 모르겠다.
새로운 도전이 되는 문제였다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글