프로그래머스 Lv1 : 카펫

문제설명


접근법

해당 문제는 카펫의 가로 길이와 세로 길이를 구하는 문제이다.

전체 카펫의 수는 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