[ALGORITHM] 프로그래머스 완전탐색 3번 카펫

NinjaJuunzzi·2021년 5월 6일
0

내 코드

function solution(brown, yellow) {
  var answer = [];

  for (var a = 1; a <= yellow; a++) {
    if (yellow % a === 0) {
      if ((yellow / a + 2) * 2 + a * 2 === brown) {
        if (a + 2 <= yellow / a + 2) {
          answer.push(yellow / a + 2);
          answer.push(a + 2);
        } else {
          answer.push(a + 2);
          answer.push(yellow / a + 2);
        }
        break;
      }
    }
  }
  return answer;
}
solution(10, 2);

좀 급하게 푸느라 정리가 안된 모습이다....
내가 생각한 로직은 다음과 같다.

모든 탐색을 노란색의 갯수를 기준으로 수행한다.

노란색을 한 줄로 만들때
노란색을 두 줄로 만들때
노란색을 세 줄로 만들때 ....

모든 가능한 수를 전부 탐색한다. 이 때 노란색은 완전한 사각형의 형태를 가져야하므로 나누어 떨어지는 경우에만 처음 들어온 갈색 갯수가질 수 있는 갈색 갯수가 같은지 비교한다.

같으면 정답 이므로 answer에 큰 순서대로 넣는다.

다른 사람 코드



// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function solution(brown, red) {
    var answer = [];
    for (var i = 3; i <= (brown+red)/i; i++) {
        var x = Math.floor((brown+red)/i);
        if( (x-2)*(i-2)=== red) {
            break;
        }
    }

    return [x,i];
}

i는 전체 세로 줄을 의미한다. 전체 세로줄을 정해놓으면 문제의 카펫은 사각형을 유지해야하므로 전체 가로줄을 정할 수 있다. brown+red / 세로줄 은 가로줄임.

가로줄에서 두개 빼면 노란색의 가로줄임
세로줄에서 두개 빼면 노란색의 세로줄임

이 둘을 곱하면 노란색의 갯수가 나와야 정답. ( 아마 나누어 떨어지는 경우에만 답이 나올 것임. )

느낀점

  • 비교적 쉬운 문제였다. 소요시간은 20분? 정도 걸린 것같다.
  • 다른 사람의 코드를 보니 자괴감만 든다.... 딱히 리뷰할 점은 없는 것 같다.

Reference

-프로그래머스

profile
Frontend Ninja

0개의 댓글