A.P - 카펫(프로그래머스, L2)

EBinY·2022년 10월 31일
0

AP - Algorithm Problem

목록 보기
54/55
  1. 문제
  • 완전탐색을 활용하는 문제
  • 격자로 색상이 구성되었고, 바깥테두리의 1칸은 갈색이고 안쪽은 노란색인 카펫이 있다
  • 갈색과 노란색이 몇칸인지만 기억이 나는 카펫의 가로와 세로를 구하여 리턴하라
  1. 수도코드
// 면적의 조건을 정리하고 시작해야 함
// 1. 전체 면적 C는 b + y 이고, 또한 w x h 이다
// 이는 이미 주어진 b+y의 값을 통해
// 예상되는 w,h 값의 쌍을 구할 수 있다는 의미
// 2. b의 값은 w*2 + h*2 - 4 이다
// 3. y의 면적은 C의 w-2 x h-2 이다
// 1번조건을 통해 예상되는 w,h값을 구하고
// 구한 값들을 2,3조건에 전부 부합되는 값을 찾아 리턴하자
  1. 시도
// 각각의 조건들을 따로 계산하여 예상값과 그 값으로 조건을 비교하는 이중반복문을 작성하였다
// 효율이 상당히 떨어지고 가독성이 떨어지며, 2번조건에서는 중복되는 값이 발생한다
function solution(brown, yellow) {
    // 전체 면적을 변수로 선언
    let C = brown + yellow;
    // 예상값을 저장할 빈 배열을 선언
    let arr = [];
    // 예상값의 짝을 매칭해 배열형태로 저장
    let parr = [];
    // C를 통하여 예상값을 찾아서 저장하자
    for (let i = brown; i >= 3; i--) {
        // C를 나눈 값이 떨어지면 공배수가 되므로 예상값에 저장
        if ((C % i) === 0) {
            arr.push(i);
        }
    }
    // 예상값을 통해 2번조건에 맞는 값을 찾아보자
    for (let i = 0; i < arr.length; i++) {
      for (let j = 0; j < arr.length; j++) {
        if (arr[i] * arr[j] === C && (arr[i]*2) + (arr[j]*2) - 4 === brown) {
          parr.push([arr[i],arr[j]])
          
        }
      }
    }
  return parr[0]
}
  1. 레퍼런스
function solution(brown, yellow) {
    for (var i = 3; i <= (brown+yellow)/i; i++) {
        var x = Math.floor((brown+yellow)/i);
        if( (x-2)*(i-2)=== yellow) {
            break;
        }
    }
    return [x,i];
}
  1. 레퍼런스 공부 및 주석
// 반복문에서 var를 통하여 변수 선언을 최소화시켰음
// 코드의 간결성은 좋으나, let을 통한 변수 선언으로 관리하는 것이 나을 것 같음 
// 반복문 내부에서 조건 및 계산식을 적용하여 불필요한 연산을 최대한 줄였다
// 또한 break를 통해 답을 찾은 후 바로 계산을 종료하게끔 하였음
function solution(brown, yellow) {
    for (var i = 3; i <= (brown+yellow)/i; i++) {
        var x = Math.floor((brown+yellow)/i);
        if( (x-2)*(i-2)=== yellow) {
            break;
        }
    }
    return [x,i];
}

0개의 댓글

관련 채용 정보