프로그래머스(Programmers) 카펫

🙋‍♀️ 문제 정보

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

✨ 풀이

소스 코드

function solution(brown, yellow) {
  var answer = [];
  let row = 0;
  let col = 2;
  for (let i = 1; i <= brown / 4; i++) {
    col++;
    row = (brown - i * 2) / 2;
    let mid = i * (row - 2);
    if (mid === yellow) {
      answer.push(row, col);
      break;
    }
  }
  return answer;
}

결과

  • 성공

해결 방법

해당 문제는 완전 탐색 문제로 차근차근 어떻게 문제를 풀어나가야하는지 생각해보자.
우선 노란색 격자의 수가 1개 이상이기 때문에 세로줄과 가로줄은 무조건 3줄 이상이어야한다.
가로 길이가 세로 길이보다 같거나 크다고 했기 때문에 세로를 한줄씩 늘리면서 노란 타일 수와 일치하는 가로와 세로줄을 찾아가는 방식으로 해결해야하는데, 이는 세로줄을 한줄씩 늘려가는 반복문을 통해 해결한다.
세로줄을 한줄씩 늘려가면서 매개변수의 갈색 타일 수를 기반으로 가로줄을 계산한다. 갈색 타일에서 i x 2 를 빼준 다음(가장 가장자리 가로줄이 아닌 것은 두개씩 증가한다.) / 2를 해준다.(가장 가장자리의 가로줄이 윗줄과 아랫줄 총 두 줄이기 때문이다.) 예를 들어 세로가 3일 때 (i = 1이다) 매개 변수인 갈색 타일의 값이 24라면 가로줄의 계산은 24 - (1 x 2) / 2 로 계산한다. 즉, 갈색 타일의 수 - (i x 2) / 2이다. 그러므로 i는 갈색 타일의 수 / 4 만큼만 반복할 수 있다.
가장 가장자리 가로 갈색 타일의 수에서 양쪽 타일 하나씩 뺀 값이 노란색 타일의 가로 타일 수 이므로 해당 부분을 유념해서 노란색 타일 수를 계산한다. 예를 들어 세로가 3일 때 (i = 1이다) 가로줄은 11이다. 따라서 노란색 타일의 수는 1 x (11 - 2) 이다. 즉, i x (가로줄의 수 - 2) 이다. 매개변수의 노란색 타일과 계산한 값이 일치한다면 answer 배열에 가로줄과 세로줄을 차례로 넣어주고 break를 통해 반복문을 빠져나온다.
처음에는 당황스러울 수 있으나 직접 하나씩 늘려가면서 그림을 그려본다면 해당 로직에 대한 이해가 쉬울 것 같다.👍

profile
유영하는 개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN