본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 카펫

by StelthPark 2022. 3. 24.

처리조건

풀이

테스트 케이스의 brown과 yellow에 의한 return 값을 자세히 보자. b와 y의 합은 return 값을 곱한게 된다.

b+y의 약수를 구해보면 10,2에서 합은 12가 되고 [1,12], [2,6], [3,4] 가 된다. 순서대로 나열하면 1,2,3,4,6,12가 된다.

각 1,2,3중 가장 큰수인 3이 return 값의 y축이 되며 b+y를 y축으로 나누면 x축을 구할 수 있다.

 

sqrt를 사용해 for문을 최소한으로 돌리는 약수 찾기 함수를 생성하여 b+y를 인자로 전달한 뒤 1,2,3을 담아 내림차순으로 정렬하여 리턴해주게 된다. 받은 1,2,3을 for문으로 다시 돌려 각 1,2,3마다 x,y축을 구하며 가운데 노란카페트가 깔리면 그 주위에는 1개의 갈색 테이블들이 깔린다는 점을 이용해 x-2와 y-2를 곱하면 가운데 노랑색이 나와야한다. 해당 조건에 일치하는 x,y를 구하자마자 바로 return 하며 for문을 종료시킨다.

function solution(brown, yellow) {
  let start = brown + yellow;

  let arrY = isPrimeNumber(start);
  for (let i = 0; i < arrY.length; i++) {
    let [x, y] = [start / arrY[i], arrY[i]];
    if ((x - 2) * (y - 2) === yellow) return [x, y];
  }
}

let isPrimeNumber = (n) => {
  let result = [];
  if (n < 2) {
    return false;
  }
  // i<=Math.sqrt(n) 대신 i*i <= n 이 더 바람직한 코드이다.
  // 실수를 사용하는 것은 바람직하지 않기 때문.
  for (let i = 2; i <= Math.sqrt(n); i++) {
    if (n % i === 0) {
      result.push(i);
    }
  }
  result.sort(function (a, b) {
    if (a > b) return -1;
    if (a === b) return 0;
    if (a < b) return 1;
  });
  return result;
};

댓글