코딩테스트

[프로그래머스/자바] 피로도_87946

라임온조 2023. 7. 17. 16:58

문제 및 코드

 

1. 생각

// 생각
    // 던전들을 각기 다른 모든 순서로 돌면서 탐험 가능한 최대 던전 개수를 구해야 한다
    // 예를 들어 3개라면 123 132 213 231 312 321 ... 
    // 각 던전 for문 돌면서 재귀로 완전탐색하면 되지 않을까?
// 구현
    // for문으로 던전을 돈다
        // 각 던전을 시작으로 해서 순차적으로 다른 던전 돌도록 탐색을 해본다
            // 현재 피로도가 최소 필요도보다 크거나 같다
                // 현재 피로도 = 현재 피로도 - 소모 필요도
            // 현재 피로도가 최소 필요도보다 작다
                // 중단

----

// 생각
    // 던전을 돌 수 있는 모든 경우의 수를 돌면서 총 몇 개를 방문할 수 있는지 세어야 함
    // 완전탐색, 재귀로 구현 가능
// 구현
    // 방문배열 초기화
    // 재귀 함수에 매개변수로 주어야 할 것들
        // 던전 배열, 현재 피로도, 현재까지 방문한 개수 
    // 재귀 함수
        // 던전 돌기
            // 현재 던전 방문 안 함 && 현재 피로도 >= 현재 방문한 던전의 최소 필요 피로도
                // 현재 피로도 -= 사용 피로도
                // 방문 표시
                // count 증가
                // 재귀함수 다시 방문
                // 방문 취소
            // 현재 던전 방문 || 현재 피로도 < 현재 방문한 던전의 최소 필요 피로도    
                // 그냥 패스
        // for문 돌면서 얻은 count와 현재 answer중 최댓값으로 answer 갱신

2. 회고

  • 저번에 풀었던 재귀 완전탐색과 비슷한 스타일이어서 최대한 그때의 기억을 떠올리며 재귀 함수를 구현해보려고 하였다.
  • 재귀로 구현하고자 할 때는 재귀 함수에 넘겨줘야 하는 매개변수 값과 재귀를 마친 후 초기화 되어야 하는 값들을 잘 구별해서 매개변수로 넣어줄 건 넣어주고, 초기화할 건 초기화해야 올바른 코드를 작성할 수 있다. 보통 방문 배열은 재귀 함수 끝 부분에 초기화해서 방문했던 정보를 초기화한 후 이후 for문에서 다시 방문하도록 하는 것 같고, 보통 배열에 접근해야 하기 때문에 index를 넘겨줘야 하고, 하나의 탐색을 한 후 값이 처음으로 돌아와야 하는 변수들도 매개변수로 넘겨줘야하는 것 같다.
  • 또한, 재귀 함수 내부에 for문을 두고, 그 for문 안에 방문 배열의 방문 여부를 확인한 후 방문하지 않았을 경우 다시 재귀함수를 호출하는 형식으로 완전 탐색이 구현될 수 있다. 
  • 저번에는 잘 이해가 안 되었던 재귀함수를 활용한 완전 탐색이 이번에는 더 잘 이해가 되어서 뿌듯하다.
  • 그런데 다른 풀이들 보니 나보다 코드가 더 짧고 간결한 것들이 있어서 좀 더 간단히도 할 수 있구나... 이런 반성의 마음가짐을 가지기도 하였다.

---

  • 재귀 연속으로 풀었을 때는 그래도 곧 잘 풀어냈는데 안 하다보니 또 까먹어서 애먹음
  • 지난번에 어떻게 풀었는지 생각이 안 나서 참고함... 근데 지난번에 푼 재귀는 되게 비효율적이라 다른 재귀 풀이를 참고하였음
  • 다른 재귀 풀이는... 손으로 메모해 가면서 이해하면 이해가 가긴 하는데 내가 구현해내는 데는 아직 이해가 가지 않는다. 이해가 될랑 말랑
  • 이 문제를 포함한 완전탐색을 위한 재귀의 핵심은 재귀에 들어가서 for문을 돌고 재귀 호출한 후 방문 배열을 초기화해서 for문 하나로 완전탐색을 할 수 있다는 것 같다. 다른 비슷한 완전탐색에 적용하면 좋을듯

 

3. 체크

풀이 횟수 시간 정답 여부 참고 여부
2 1시간 20분 O X
3 1시간 X O