본문 바로가기
자료구조 & 알고리즘

[코딩테스트] 프로그래머스 - 카펫 ( 자바스크립트 풀이 )

by PARADISE247 2024. 1. 13.
반응형

문제

문제 설명

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

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한사항

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

 

입출력 예

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

문제 풀이

1차 시도 - 실패했던 코드 🤨

function solution(brown, yellow) {
  var answer = [];
  let width = 3;
  let height = (brown + yellow) / width;
  while (true) {
    if ((brown + yellow) % width !== 0 || width < height) {
      width += 1;
      height = (brown + yellow) / width;
    } else {
      if (brown + yellow - (width * 2 + height * 2 - 4)) {
        answer = [width, height];
        break;
      } else {
        width += 1;
        height = (brown + yellow) / width;
        return;
      }
    }
  }
  return answer;
}

 

2차 시도 - 테스트 통과한 코드 🤩 while 사용

노란색 칸의 갯수(가로길이 -2) * (세로길이-2) 와 같아야한다는 조건을 찾아내면 쉽게 풀 수 있다. 아래는 while문을 이용한 풀이이다. for문을 사용한 더 간단한 풀이는 바로 아래에 있다. 

function solution(brown, yellow) {
  var answer = [];
  let width = 3;
  let height = (brown + yellow) / width;
  while (true) {
    if (width < height || (brown + yellow) % width !== 0) {
      width += 1;
      height = (brown + yellow) / width;
    } else {
      if ((width - 2) * (height - 2) === yellow) {
        answer = [width, height];
        break;
      } else {
        width += 1;
        height = (brown + yellow) / width;
      }
    }
  }
  return answer;
}

 

for문 이용한 더 간결한 버전

위의 while문을 사용한 코드와 같은 조건을 바탕으로 for문을 이용한 코드를 작성해보았다. 

function solution(brown, yellow) {
  let answer = [];
  for (let i = 3; i <= (brown + yellow) / i; i++) {
    let width = Math.floor((brown + yellow) / i);
    if ((width - 2) * (i - 2) === yellow) {
      answer = [width, i];
    }
  }
  return answer;
}

 

for문의 변수 i는 width(가로 길이)의 변수 역할을 한다. 

let i = 3;

 

for문에서 이 조건은 가로 길이가 세로 길이보다 크거나 같아야 한다는 조건을 나타낸다. 

i <= (brown + yellow) / i;

 

while 풀이에서와 마찬가지로 (가로길이 - 2) * (세로길이 -2) 가 yellow와 같은 경우, 그때의 width와 i값이 각각 가로와 세로 길이 답이 된다. 

  let width = Math.floor((brown + yellow) / i);
  if ((width - 2) * (i - 2) === yellow) {
	answer = [width, i];
  }
반응형