TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 피로도

여의도사노비 2023. 1. 11. 14:30
728x90

이 문제는 사실 엄청 쉬울줄 알았는데... 못풀겠더라...!

결국 구글링을 해봤는데 다른 분들의 코드를 봐도 처음엔 이해가 잘 안갔다...

그러다 Fomagran님의 코드도 확인했는데 코드를 너무 잘 짜셔서(그 전에도 몇번 도움을 받았다... 항상 감사합니다 :))

코드를 참고하고자 했다.

 

그런데! 코드에서 이해가 안가는 부분이 있었다.

그것은 바로 함수의 파라미터에 &를 붙이는 것과 inout이라는 키워드...! 이것이 아예 뭔지 몰라 이것부터 확인해보았다.

간단하게 그 내용을 정리하자면... 기존에 파라미터에 사용되는 값들은 전부 상수였다. 하지만 재귀라던지 func안의 func 등 여러가지 사용성으로 인해 파라미터 값을 변수로 받을 수 있도록 지원하는데... 그것이 바로 Inout 개념이다.

이렇게 두 파라미터에 inout을 붙여주면 이 파라미터 값이 상수가 아닌 변수 값이 들어오는 것으로 인식하겠다는 뜻인 것이다.

그렇게 someInt와 anotherInt라는 변수값에 &를 붙여서 파라미터로 활용해주면 된다! (&의 표시가 inout 형태의 파라미터로 사용하겠다는 뜻) 더 자세한 내용은 아래 참고한 블로그에서 아주 아주 자세히 정리를 잘해주셨다!

(Inout 참고한 블로그: https://hyunsikwon.github.io/swift/Swift-Inout-01/)

(코드 참고한 블로그: https://fomaios.tistory.com/entry/Swift-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9C%84%ED%81%B4%EB%A6%AC-%EC%B1%8C%EB%A6%B0%EC%A7%80-%ED%94%BC%EB%A1%9C%EB%8F%84)

 

 

 

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

  1. 던전을 돌 때 필요한 최소 피로와 돈 후 소모할 피로보다 k가 큰지 확인한다.
  2. 크다면 newK에 새로운 피로도를 할당해주고
  3. 탐험한 던전은 배열에서 지워준다. 그리고 다시 explore를 시작한다.(재귀)
  4. 만약 작다면 다음 원소의 배열로 넘어가 시작한다.(첫번째 원소 시작 -> 크다? -> 첫번째 원소 지우고 , 카운트 + 1, -> 두 번째 원소... But, 첫번째 원소 시작 -> 작다? -> 바로 다음 원소로 시작...)
  5. ans를 매번 그 전 ans와 count 값을 비교하여 최대값으로 최신화해준다.

 

 

* 참고한 코드

func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
    var ans: Int = 0
    explore(dungeons: dungeons, ans: &ans, k: k, count: 0)
    return ans
}

func explore(dungeons: [[Int]], ans: inout Int, k: Int, count: Int) {
    ans = max(ans, count)
    for (i, dungeon) in dungeons.enumerated() {
        var newDungeons:[[Int]] = dungeons
        if dungeon[0] <= k && dungeon[1] <= k {
            let newK = k - dungeon[1]
            newDungeons.remove(at: i)
            explore(dungeons:newDungeons, ans: &ans, k: newK, count: count + 1)
        }
    }
}

여러가지 블로그를 참고해서 코드를 살펴봤지만... 이 코드만큼 간결하고 눈에 들어오는 코드는 없는 듯 하다! 진짜 알고리즘 고수들 너무 많아... 앞으로 더 많이 참고해서 이런 논리의 흐름을 체득해야겠다.

 
 

정리(Today I Learned)

  1. 놀랄만큼 지금까지 알고리즘을 풀면서 파라미터로 변수를 써본 적이 없는 것 같다. 아마 이제 난이도가 좀 높아져서 재귀라던지, 복잡함을 줄이기 위한 함수의 활용이라던지가 늘어나서 필요성을 이제야 느꼈다!
  2. inout 변수: 상수가 아닌 변수 파라미터, 재귀 혹은 중첩된 함수문을 사용할 때 파라미터의 값을 최신화하기 위해 사용된다.