문제: 주어진 brown(갈색 격자 수)와 yellow(노란색 격자 수)를 기반으로 카펫의 가로와 세로 크기를 구하는 문제.
조건:
카펫의 격자는 brown과 yellow의 합으로 구성됨.
카펫의 테두리 1줄은 항상 갈색(brown)이고, 중앙은 노란색(yellow).
가로(width)는 세로(height)보다 크거나 같아야 함.
목표: width, height를 순서대로 배열에 담아 반환.
전체 격자 수 계산:
카펫의 전체 격자 수는 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] 반환.
문제 제한상 조건을 만족하지 않는 경우는 없음.
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 [] // 조건을 만족하는 경우가 없으면 빈 배열 반환 (문제 제한상 발생하지 않음)
}
전체 격자 수 계산:
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]를 반환.
모든 조건이 만족되지 않는 경우 빈 배열을 반환(제약사항에 따라 이 경우는 발생하지 않음).
완전탐색의 중요성:
가능한 모든 경우를 탐색하며 조건을 확인하는 것이 핵심.
문제 제약사항 활용:
문제에서 제공된 조건(테두리와 중앙의 관계)을 수학적으로 활용하여 풀이의 효율성을 높임.
Swift의 반복문 활용:
1...total을 활용한 간단한 반복문과 조건문으로 문제를 해결.
탐색 범위:
height는 1부터 total의 약수만 탐색.
시간 복잡도:
약수를 탐색하므로 대략적으로
O(√total)
brown yellow result
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]
이번 문제를 통해 완전탐색과 조건 확인을 활용한 문제 해결 방법을 연습할 수 있었다.
Swift의 반복문, 조건문 활용이 간단하고 직관적이라는 점을 다시 한번 느꼈다.