TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 구명보트_그리디

여의도사노비 2023. 2. 6. 23:41
728x90

처음으로 Swift를 지원하지 않는 문제를 풀어보았다... 스터디하면서 나온 문젠데 어쩌다 보니 여기까지..?
기본으로 제공하는 테스크케이스와 몇가지 넣어서 돌려봤는데 일단 답이 나온다...! 그러나 전부 맞는지 확인해보지는 않았기 때문에 좀 찝찝 ^-^...

 

⛔️ 따라서 이 코드가 맞는 코드가 아님을 주의해주세요! ⛔️

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. 우선 올림차순으로 정리한다.
  2. 이 때 가장 가벼운 순으로 보트에 태우고 다음 사람들을 태울 수 있는지 확인한다.
  3. 그리고 추가로 태울 수 있는 사람들 중에 가장 limit 값에 가까운 무게를 가진 사람을 태운다.
  4. 이렇게 가장 효율적인 방식으로 두 명이 한 번에 강을 건넌다.
  5. 그 후 배를 다시 초기화 시켜주고 count는 올려준다.

 

 

* 코드

import Foundation

func solution(_ people: [Int], _ limit: Int ) -> Int {
    var arrPeople = people.sorted()
    var boat: [Int] = [0, 0]
    var count = 0
    
    // arrPeople의 원소 삭제, 0 대입 후 다시 값을 확인하기 위해 for문을 크게 돌림
    for _ in 0... {
        // 배열의 원소가 전부 0이면 break
        if arrPeople.reduce(0, +) == 0 { break }
        
        for i in 0..<arrPeople.count {
            var idx = 0 // 가장 큰 값을 갖게 만든 수가 있던 자리
            var temp = 0 // 가장 큰 값을 갖게 만드는 수를 찾기 위해 비교할 임시값
            
            boat[0] = arrPeople[i]
            arrPeople.removeFirst()
            
            for j in 0..<arrPeople.count {
                if boat[0] + arrPeople[j] >= temp && boat[0] + arrPeople[j] <= limit {
                    temp = boat[0] + arrPeople[j]
                    boat[1] = arrPeople[j]
                    idx = j
                }
            }
            
            // 보트의 두번째 칸에 다른 값이 동승했을 때만 0을 넣어줌. 이렇게 하지 않으면 뒤에 0으로 바꿔준 값들이 엉켜서 오류 발생
            if boat[1] != 0 {
                arrPeople[idx] = 0
            }
            
            boat = [0, 0]
            count += 1
            break
        }
    }
    return count
}

 

 

정리(Today I Learned)

  1. 애초에 For문이 많이 겹쳐서 시간복잡도는 포기하고 푼 문제... 그래도 뭔가 Swift를 지원해주지 않는 문제를 Swift로 풀어봐서 재밌었다. :)