/**
* 카펫 - 완전 탐색
* https://programmers.co.kr/learn/courses/30/lessons/42842?language=javascript
* 가로 >= 세로
*/
/** 1 */
function solution(brown, yellow) {
const area = brown + yellow;
for (let i = 1; i<=2501; i++) {
for (let j =1; j<=2501; j++) {
if (i*j === area && (2*i + 2*j - 4 === brown)) return [Math.max(i, j), Math.min(i, j)];
}
}
}
console.log(solution(10, 2));
console.log(solution(8, 1));
console.log(solution(24, 24));
첫번째 풀이는 2x가로 + 2x세로 - 4 = brown 인데, brown이 8이상 5000이하이므로 brown 을 최댓값 5000 으로 두고, 가로 세로에서 한 쪽의 최솟값을 2라고 두고 계산하면 다른 한 쪽의 최댓값은 2501 이 된다. 즉, 가로 세로가 2501 보다 클 수 없으므로, 2501 x 2501 의 이중 for 문으로 주어진 식을 계산하면 위와 같은 코드로 답을 얻을 수 있다. 하지만 범위가 넓어 시간이 오래걸린다.
/** 2 */
function solution(brown, yellow) {
const w_plus_h = brown/2 + 2;
for (let w=1; w<w_plus_h; w++) {
const h = w_plus_h - w;
if (w*h === (brown+yellow)) return [Math.max(w, h), Math.min(w, h)];
}
}
console.log(solution(10, 2));
console.log(solution(8, 1));
console.log(solution(24, 24));
위에서 처음 푼 방법을 기반으로 가로 세로 각각의 최대 값을 구하는게 아니라, w + h 값을 구하고, 그 범위만큼 w와 h 를 구해서 그 범위 안에서만 for 문을 통해 답을 얻을 수 있다. 처음 해보다 훨씬 빠르다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][자바스크립트][Level2] 소수 찾기 (0) | 2022.01.03 |
---|---|
[프로그래머스][자바스크립트][Level1] 모의고사 (0) | 2022.01.03 |
[프로그래머스][자바스크립트][Level1][카카오] 숫자 문자열과 영단어 (0) | 2022.01.02 |
[프로그래머스][자바스크립트][Level1] 로또의 최고 순위와 최저 순위 (0) | 2022.01.01 |
[프로그래머스][자바스크립트][Level1] 부족한 금액 계산하기 (0) | 2021.08.05 |
댓글