문제설명

접근법
해당 문제는 카펫의 가로 길이와 세로 길이를 구하는 문제이다.
전체 카펫의 수는 brown 카펫 수 + yellow 카펫 수 이고, 가로 길이와 세로 길이는 ( brown 카펫 수 + yellow 카펫 수) 의 약수 한 쌍과 같다.
또한 조건으로 "카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다." 라는 지문이 있으므로 배열의 0번째 인덱스에는 약수쌍에서 큰 수를 , 1번째 인덱스에는 작은수를 넣으면 된다.
마지막으로 yellow 카펫은 가운데에 존재해야 하고 brown 카펫은 테두리 1줄만을 차지하므로 상하좌우 1칸씩은 모두 brown 카펫이어야 한다.
약수 한 쌍 배열에서 (큰 약수-2 * 작은 약수-2) === yellow 조건을 일치하는 약수쌍이 정답이다.
수도코드
// solution(brown, yellow) 함수
// 1. 카펫의 총 격자 수(total_squares)를 계산한다.
// total_squares = brown + yellow
// 2. 약수 쌍을 구하는 함수(get_divisors)를 호출한다.
// 이 함수는 num을 인수로 받아 num의 모든 약수 쌍을 찾아 반환한다.
// divisor_pairs = get_divisors(total_squares)
// 3. 약수 쌍들 중에서 조건을 만족하는 유일한 쌍을 찾는다.
// - divisor_pairs 배열의 각 쌍 [가로, 세로]에 대해 반복한다.
// - 조건: (가로 - 2) * (세로 - 2)가 yellow와 같은지 확인한다.
// - 이 조건을 만족하는 쌍을 찾아 result에 저장한다.
// 4. 찾은 결과(result)를 반환한다.
// (예: [4, 3]과 같은 형태로)
// get_divisors(num)
// 1. 약수 쌍을 담을 빈 배열(pairs)을 준비한다.
// 2. i를 1부터 num의 제곱근까지 반복한다.
// 3. 만약 num이 i로 나누어 떨어진다면:
// - [i, num / i]를 짝으로 묶는다.
// - 이 짝을 내림차순으로 정렬한다 (가로 >= 세로 조건을 맞추기 위해).
// - 정렬된 짝을 pairs 배열에 추가한다.
// 4. pairs 배열을 반환한다.'알고리즘 > 수도코드' 카테고리의 다른 글
| 프로그래머스 1Lv : 문자열 나누기 (0) | 2025.08.25 |
|---|