https://school.programmers.co.kr/learn/courses/30/lessons/86491
알고리즘 고득점 Kit 의 완전탐색 문제이다!
일단 완전탐색의 문제라고 알고 들어가니 쉽게 풀리겠구나 싶었는데 생각보다 애먹었던 문제였습니다...
명함을 눕혀서 수납하면 더욱 작은 크기의 지갑으로 만든다
라는 중요한 조건이 보입니다
문제 설명에도 적혀있는거 처럼 세로의 가장 큰 길이(70)가 가로의 가장 큰 길이(80)보다 작고 해당 가로의 길이(30)이 세로의 길이(70) 보다 작을 때 바꿔주면 더 작은 사이즈의 지갑을 만들 수 있겠다 싶었습니다
처음엔 굉장히.. 꼬아서 생각을 했지만 고민을 해보니 생각보다 엄청 단순한 문제였습니다
func solution(_ sizes:[[Int]]) -> Int {
var w = [Int]()
var h = [Int]()
for i in 0..<sizes.count {
w.append(max(sizes[i][0], sizes[i][1]))
h.append(min(sizes[i][0], sizes[i][1]))
}
return w.max()! * h.max()!
}
일단 가로와 세로를 분리하기 위해 w,h 배열을 만들어 주었습니다
그 다음 명함의 크기를 갖고있는 sizes 배열을 완전탐색을 하기 위해 반복문을 만들어줍니다
여기서 중요한건 모든 길이를 정렬하고자 합니다
가로와 세로의 길이중 더 큰 것을 w 에, 작은 것을 h 에 넣게되면 8개의 숫자 중 4개의 큰수는 w, 나머지 4개는 h 로 분리가 됩니다
문제 설명으로 예시를 잡게되면
w 에는 60, 70, 60, 80
h 에는 50, 30, 30, 40
으로 나누게 됩니다
가로와 세로의 길이를 바꾸기 위해 인덱스를 알필요 없이 서로 바꿀 수가 있는 것이죠
이렇게 분리를 해서 w 와 h 에서 서로 가장 큰 수를 뽑으면 가장 작은 크기의 지갑을 만들 수 있습니다
또.. 느끼지만 제발.. 문제 설명처럼 풀지말자~~!