카펫 #42842
https://school.programmers.co.kr/learn/courses/30/lessons/42842
더보기
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
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가 더 작은 값이긴 하다. )
- 만약 x가 yellow로 나뉘어진다면, (약수이면)
'CODING TEST > Programmers' 카테고리의 다른 글
[ JavaScript ] 프로그래머스 level2 86971번 전력망을 둘로 나누기 (0) | 2024.02.18 |
---|---|
[ JavaScript ] 프로그래머스 level2 87946번 피로도 (1) | 2024.02.18 |
[ JavaScript ] 프로그래머스 level2 42839번 소수찾기 (1) | 2024.02.13 |
[ JavaScript ] 프로그래머스 level2 42627번 디스크 컨트롤러 (0) | 2024.02.12 |
[ JavaScript ] 프로그래머스 level2 42747번 H-index (0) | 2024.01.28 |