728x90
URL : https://school.programmers.co.kr/learn/courses/30/lessons/42842
JS
문제
더보기

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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
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] |
계획
노란색 타일의 개수 = (가로-2) * (세로-2)
갈색 타일 개수 = (가로+세로)*2-4
노란색 뭉쳤을 때 가로세로의 합이 (갈색/2)-3일 때가 맞는 크기임.
위의 경우를 찾고 if((yX+(yAll/yX)=== (bAll/2)-3)
총 가로세로 값 구해서 반환.
bX = yX+2
bY = (yAll/yX)+2
return [bX,bY]
참고, 풀이
function solution(brown, yellow) {
let [yX, yAll, bAll] = [1, yellow, brown];
for (yX = 1; yX < yellow; yX++) {
if (yX + yAll / yX === bAll / 2 - 3) {
return;
}
}
let bX = yX + 2;
let bY = yAll / yX + 2;
return [bX, bY];
}
테스트 3 | |
입력값 〉 | 24, 24 |
기댓값 〉 | [8, 6] |
실행 결과 〉 | 실행한 결괏값 [26,3]이 기댓값 [8,6]과 다릅니다. |
yX는 노란색타일 총 합의 약수여야 한다.
yellow % yX ===0
답
function solution(brown, yellow) {
for (let yX = 1; yX <= Math.sqrt(yellow); yX++) {
if (yellow % yX === 0) {
let yY = yellow / yX;
let bX = yY + 2;
let bY = yX + 2;
if (brown === 2 * (bX + bY - 2)) {
return [bX, bY];
}
}
}
}
코드 간략화하기
function solution(brown, yellow) {
for (let yX = 1; yX * yX <= yellow; yX++) {
if (yellow % yX === 0) {
let bX = yellow / yX + 2, bY = yX + 2;
if (brown === 2 * (bX + bY - 2)) return [bX, bY];
}
}
}
function solution(b, y) {
for (let x = 1; x * x <= y; x++)
if (y % x === 0 && b === 2 * (x + y / x + 2))
return [y / x + 2, x + 2];
}
다른사람 답
function solution(brown, yellow) {
var xpy=brown/2+2;
for(var a=1;a<xpy;a++) if(a*(xpy-a)==brown+yellow) return [Math.max(a,xpy-a),Math.min(a,xpy-a)];
}
function solution(brown, yellow) {
const x = (brown - 12) * 0.5;
const y = yellow - brown + 8;
const i = ( 8 + x + Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
const j = ( 8 + x - Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
console.log(i)
var answer = [i, j];
return answer;
}
'내일배움 과제 > 코딩테스트' 카테고리의 다른 글
알고리즘 81번 - N개의 최소공배수 (0) | 2025.02.19 |
---|---|
알고리즘 80번 - 예상 대진표 (0) | 2025.02.18 |
알고리즘 78번 - 피보나치 수 (0) | 2025.02.14 |
알고리즘 77번 - 이진 변환 반복하기 (0) | 2025.02.13 |
알고리즘 76번 - JadenCase 문자열 만들기 (0) | 2025.02.12 |