프로그래머스: 카펫

승헌·2022년 3월 21일
0

프로그래머스 Level 2

목록 보기
11/13

(문제링크)

문제

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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

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

제한사항

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

입출력 예

brownyellowreturn
102[4, 3]
81[3, 3]
2424[8, 6]

풀이

어떤 카펫이든 테두리 한줄만 갈색으로 칠해져 있다.

가운데 노란색 부분의 가로길이를 x, 세로길이를 y라고 한다면, 전체 카펫의 가로길이는 x+2, 세로길이는 y+2이다.

노란색 부분과 전체 카펫의 넓이는 각각 아래처럼 나타낼 수 있다.

  1. xy=yellowxy = yellow
  2. (x+2)(y+2)=brown+yellow(x+2)(y+2) = brown + yellow

1번을 통해, xy가 될 수 있는 후보들은 yellow의 약수 집합이라는 것을 알 수 있다.

예를 들어 yellow가 24라면 xy의 후보는 다음과 같다.

xy
241
122
83
64

이 후보 중에서 2번 식을 만족하는 값을 찾아 반환하면 된다.

yellow\sqrt{yellow} 만큼 반복문을 돌면서 정답이 나온다면 return 하기 때문에 실행시간이 길지 않다.

소스코드

function solution(brown, yellow) {
    // yellow의 약수 중 답이 되는 값만 return
    for (let i=1; i<=Math.sqrt(yellow); i++) {
        if (yellow%i === 0 && brown+yellow === (yellow/i+2)*(i+2))
            return [yellow/i+2, i+2];
    }
}

0개의 댓글