카펫

연쇄코딩마·2021년 2월 18일
0
post-custom-banner

설명 : 프로그래머스 카펫

간단 설명 : 레오는 매장에서 카펫을 사러 갔다가 카펫을 봤다. 격자 모양의 카펫이였는데 테두리 한줄은 갈색으로 칠해져 있고 격자 모양의 카펫이 였다. 집으로 돌아와 카펫을 기억했는데 기억을 하지 못했다. brown,yellow의 인자로 격자의 갯수가 주어 질때 가로,세로크기의 순서대로 배열에 담아 리턴해라.

전략 :

  • 먼저 브라운과 옐로우를 인자로 받아 더해 카펫트의 넓이를 만든다 어떤 모양이 됐든 넓이는 카펫트의 격자의 갯수이다.
  • 약수를 구한다. 카펫트의 넓이는 약수들의 곱으로 이루져 있기때문이다.
  • 조건이 테두리 한줄은 갈색으로 이루워져 있다고 했으니 카펫 모양을 몇개 그려보면...
브라운 = 0
엘로우 = 1

[
    [0,0,0],
    [0,1,0],
    [0,0,0]
]

[
    [0,0,0,0],
    [0,1,1,0],
    [0,0,0,0]
]
[
    [0,0,0,0,0],
    [0,1,1,1,0],
    [0,0,0,0,0]
]
[
    [0,0,0,0,0,0,0,0],
    [0,1,1,1,1,1,1,0],
    [0,0,0,0,0,0,0,0]
]
[
    [0,0,0,0,0],
    [0,1,1,1,0],
    [0,1,1,1,0]
    [0,0,0,0,0]
]
[
    [0,0,0,0,0,0]
    [0,1,1,1,1,0]
    [0,1,1,1,1,0]
    [0,0,0,0,0,0]
]
[
    [0,0,0,0,0,0,0,0],
    [0,1,1,1,1,1,1,0],
    [0,1,1,1,1,1,1,0],
    [0,1,1,1,1,1,1,0],
    [0,1,1,1,1,1,1,0],
    [0,0,0,0,0,0,0,0]
] 

결론은 옐로우의 가로,세로 길이는 브라운의 가로의 길이 - 2 , 세로의 길이 -2 이다.

바보같이 이 패턴을 빨리 찾지 못한것이 조금 아쉽다. 역시 그림을 그려봐야 한 눈에 들어온다 그림을 그리자!

function solution(brown, yellow) {
  let sum = brown + yellow;
  let temp = [];
  for (let i = 2; i <= Math.floor(sum / 2); i++) {
    if (sum % i === 0) {
      temp.push(i);
    }//=> 약수를 담은 배열... 여기가 실수
  }
  const getHeightWidth = (temp, yellow) => {
    let Width = temp.shift();
    let Height = temp.pop();
    let yellowWidth = Width - 2;
    let yellowHeight = Height - 2;
    //==> 약수를 구한 다음 양쪽으로 배열의 요소를 뺴내어 옐로우의 가로세로 길이를 구할수 있음
    return yellowWidth * yellowHeight === yellow
      ? [Height, Width]
      : getHeightWidth(temp, yellow);
  }; //=> 그 후 곱한 값이 본래 옐로우 값과 맞으면 리턴하고 다시 반복하는 형식 그러나 이 부분이 엄청 비효율적이라서 테케에서 런타임오류를 이르킴...
  return getHeightWidth(temp, yellow);
}

그래서 여러 다른 분들 코드를 참고하고 생각을해서 수정을 했음.

function solution(brown, yellow) {
  let sum = brown + yellow;
  for (let i = 2; i <= Math.floor(sum / 2); i++) {
    let Width = i;
    let Height = sum / i;
    if (sum % i !== 0) continue;
    if ((Width - 2) * (Height - 2) === yellow)
      return [Math.max(Width, Height), Math.min(Width, Height)];
  }
}

이렇게 하면 굳이 배열에 또 저장할 필요 없고 바로 검사하며 결론을 낸다. 비효율을 줄이자!!

profile
只要功夫深,铁杵磨成针
post-custom-banner

0개의 댓글