완전탐색 문제 "카펫"

버질·2024년 12월 16일

1. 문제 개요

문제: 주어진 brown(갈색 격자 수)와 yellow(노란색 격자 수)를 기반으로 카펫의 가로와 세로 크기를 구하는 문제.
조건:
카펫의 격자는 brown과 yellow의 합으로 구성됨.
카펫의 테두리 1줄은 항상 갈색(brown)이고, 중앙은 노란색(yellow).
가로(width)는 세로(height)보다 크거나 같아야 함.
목표: width, height를 순서대로 배열에 담아 반환.

2. 접근 방식

전체 격자 수 계산:
카펫의 전체 격자 수는 brown + yellow.

가능한 높이(height)를 순차적으로 탐색:
height는 1부터 시작하여 전체 격자 수의 약수까지 탐색.
조건: total % height == 0 (전체 격자 수가 height로 나누어 떨어져야 함).

조건 확인:
width = total / height로 가로 길이 계산.
테두리 갈색 격자 수와 중앙 노란색 격자 수가 맞는지 확인:
노란색 격자 조건: (width - 2) (height - 2) == yellow
갈색 격자 조건: 2
width + 2 * height - 4 == brown

결과 반환:
조건을 만족하면 [width, height] 반환.
문제 제한상 조건을 만족하지 않는 경우는 없음.

3. 구현 코드

import Foundation

func solution(_ brown: Int, _ yellow: Int) -> [Int] {
    let total = brown + yellow  // 총 격자 수
    
    // 가로(width)와 세로(height)를 순차적으로 확인
    for height in 1...total {
        if total % height == 0 {  // 전체 격자 수가 height로 나누어떨어지면
            let width = total / height  // 가로 길이 계산
            
            // 조건 확인: 테두리의 갈색 격자 수와 중앙의 노란색 격자 수가 맞는지 확인
            if (width - 2) * (height - 2) == yellow && 2 * width + 2 * height - 4 == brown {
                return [width, height]  // 조건을 만족하면 반환
            }
        }
    }
    return []  // 조건을 만족하는 경우가 없으면 빈 배열 반환 (문제 제한상 발생하지 않음)
}

4. 코드 분석

전체 격자 수 계산:

let total = brown + yellow

brown과 yellow를 더하여 전체 격자 수 계산.

높이(height) 탐색:

for height in 1...total {
    if total % height == 0 {
        let width = total / height
        // 조건 확인
    }
}

1부터 total까지 순회하며 total % height == 0인 경우만 진행.
해당 height로 나누어진 값을 width로 설정.

조건 확인:

if (width - 2) * (height - 2) == yellow && 2 * width + 2 * height - 4 == brown {
    return [width, height]
}

노란색 격자 수 조건:
(width - 2) (height - 2) == yellow → 테두리를 제외한 격자 수는 yellow와 같아야 함.
갈색 격자 수 조건:
2
width + 2 * height - 4 == brown → 테두리의 갈색 격자 수는 정확히 brown과 같아야 함.

결과 반환:
조건을 만족하면 [width, height]를 반환.
모든 조건이 만족되지 않는 경우 빈 배열을 반환(제약사항에 따라 이 경우는 발생하지 않음).

5. 학습한 점

완전탐색의 중요성:
가능한 모든 경우를 탐색하며 조건을 확인하는 것이 핵심.

문제 제약사항 활용:
문제에서 제공된 조건(테두리와 중앙의 관계)을 수학적으로 활용하여 풀이의 효율성을 높임.

Swift의 반복문 활용:
1...total을 활용한 간단한 반복문과 조건문으로 문제를 해결.

6. 시간 복잡도

탐색 범위:
height는 1부터 total의 약수만 탐색.

시간 복잡도:
약수를 탐색하므로 대략적으로
O(√total)

7. 예제 입출력

brown	yellow	result
10	     2	    [4, 3]
8	     1	    [3, 3]
24	     24	    [8, 6]

8. 결론

이번 문제를 통해 완전탐색과 조건 확인을 활용한 문제 해결 방법을 연습할 수 있었다.
Swift의 반복문, 조건문 활용이 간단하고 직관적이라는 점을 다시 한번 느꼈다.

profile
iOS Developer · SwiftUI & UIKit '가끔 되고 가끔 안 되는' 문제를 뿌리부터 잡습니다.

0개의 댓글