DEVELOP
article thumbnail

카펫 #42842

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

더보기

문제 설명

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

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

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

제한사항
  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예brownyellowreturn
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

 

나의 풀이

function solution(brown, yellow) {
  // yellow 칸의 가로 세로를 각각 x,y라고 하면 전체 카페트는 [x+2,y+2] 이다.
  // 2*(x+y)+4 = brown 을 만족하는 x,y를 찾는다.

  for (let x = 1; x <= Math.sqrt(yellow); x++) {
    // yellow의 약수가 되는 x를 찾는다.
    if (yellow % x === 0) {
      const y = yellow / x;
      if (2 * (x + y) + 4 === brown) {
        return x >= y ? [x + 2, y + 2] : [y + 2, x + 2];
      }
    }
  }
}
  • yellow의 가로, 세로의 길이를 각각 x,y라고 하면 전체 카페트는 yellow를 사방으로 감싸고 있는 형태이므로, x+2, y+2이다.
  • 그리고, brown 영역은 yellow의 가로, 세로를 2배한 것에 양 끝 4칸을 포함하므로, 2*(x+y)+4 = brown을 만족한다.
  • 따라서, yellow의 가로가 될 수 있는 x값을 찾고,  그 값이 2*(x+y)+4 = brown 인지를 판별한다. 
  • yellow의 가로가 될 수 있는 값, 즉 약수를 찾기 위해 1부터 yellow의 제곱근을 씌운 값까지 1씩 증가시키며 아래를 반복한다.
    • 만약 x가 yellow로 나뉘어진다면, (약수이면) 
      • y는 yellow를 x로 나눈 값이다.
      • 2*(x+y)+4 = brown 을 만족한다면, 정답을 리턴하는데, 더 긴 쪽이 가로라고 했으므로, 
        x가 y보다 크거나 같으면 [x+2,y+2] , 작으면 [y+2,x+2]를 리턴한다. 
        ( 하지만 1부터 증가시켜 약수를 찾았기 때문에 항상 x가 더 작은 값이긴 하다. ) 

정확성 테스트 결과

 

profile

DEVELOP

@JUNGY00N