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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
내 풀이
import Foundation
func solution(_ brown:Int, _ yellow:Int) -> [Int] {
var allCases = [Int: Int]()
var result = [Int]()
func calcAllCases(_ totalCount: Int) {
for i in 1...totalCount {
let j = totalCount / i
guard totalCount % i == 0, i >= j else { continue }
allCases[i] = j
}
}
calcAllCases(brown + yellow)
let keys = allCases.keys
keys.forEach { key in
let value = allCases[key]!
if (key-2) * (value-2) == yellow {
[key, value].forEach { result.append($0) }
}
}
return result
}
결국 테두리가 1줄임이 포인트였음. 주석을 통해 접근을 시도했고 이를 식으로 어떻게 풀어버리지?라는 생각을 하면서 접근했다.
/* 총 개수 기준 경우의 수
10 + 2 = 12 ==> 4*3, 6*2, 12*1
8 + 1 = 9 ==> 3*3, 9*1
24 + 24 = 48 ==> 8*6, 12*4, 16*3, 24*2, 48*1
내부 노란 격자 기준 경우의 수
2 ==> 2*1
1 ==> 1*1
24 ==> 6*4, 8*3, 12*2, 24*1
가로 6+2 2줄 = 16, 4*2 = 8, 16 + 8 = 24 (24, 24의 경우)
총 개수 기준 순서쌍에서 -2씩 빼서 곱했을 경우 yellow의 개수가 나온다? ok.
*/
대충 사고의 흐름이 이렇게 흘러갔고 노란 격자와 총합 격자의 관계성을 인지하고 나서 이렇게 선조건 제시 후 순서쌍의 경우의 수 모두를 구하고 추가 작업을 통해 문제에서 요구하는 조건에 적합한 순서쌍을 구했다.
보통 딕셔너리의 경우 다른 컬렉션보다 좀 더 효율적인 면이 있다고 들어 이용을 해보았는데 아직 여기에선 얼마나 메리트있는지 파악하기 힘들었다. 조금 더 효율적인 방법이 있을 것 같아서 생각해봐야할 것 같다. 예를 들면 keys를 받고 정렬을 할지 말지 고민하다가 정렬을 하게 되면 추가 작업이 필요하게 되는 부분이니 하지않도록 했다. 더 작은 수일수록 확률에 가깝다는 증거도 없었고.
'Algorithm' 카테고리의 다른 글
[Algorithm / 25.04.04] 프로그래머스 - 피로도 (2) | 2025.04.04 |
---|---|
[Algorithm / 25.03.21] 달리기 경주 (0) | 2025.03.21 |
[Algorithm / 25.03.20] 카드 뭉치 (2) | 2025.03.20 |
[Algorithm / 25.03.18] 추억 점수 (5) | 2025.03.18 |
[TIL / 25.03.11] 숫자 야구 게임을 만들어보았소. (1) | 2025.03.11 |