개발 무지렁이

[문제풀이 py] P87946 피로도 본문

코딩 테스트/문제풀이 Python ver.

[문제풀이 py] P87946 피로도

Gaejirang-e 2023. 7. 5. 22:07

피로도 / 완전탐색 순열 🍔


  🎠. 'itertools 모듈'을 이용해 'permutations()' 메서드를 이용할 줄 알아야 한다 => '순열'
  🎠. 'max() 빌트인 함수'를 이용해 '현재값'을 '이전값'과 비교해서, 큰 값을 '이전값'으로 넣어서 '최대값'을 찾는다.
  import itertools

  def solution(k, dungeons):
      length = len(dungeons)
      # 순열
      res = itertools.permutations(dungeons, length)
      perm = list(res)
      # print(perm)

      prev = 0
      for case in perm:
          fatigue = k
          cnt = 0
          # 각 던전을 돌면서
          for dungeon in case:
              # 현재 피로도가 최소 피로도보다 높으면
              if fatigue >= dungeon[0]:
                  fatigue -= dungeon[1] # 소모 피로도
                  cnt += 1
          prev = max(prev, cnt)
      print(prev)
      return prev

💡. 문제 접근 방법
: 돌아야 하는 던전의 순서에는 딱히 규칙이 없어보인다.
결국 모든 순서의 조합을 비교해서 그 중 돌 수 있는 던전의 수가 가장 큰 값을 리턴해야 하는데,
이는 완전탐색순서가 결과에 영향을 미치는 순열을 이용하면 된다.
순열로 만든 각 case에서 나온 결과가 이전의 결과보다 크면 이전값을 갱신해 주는 방식으로 문제를 해결했다.
(이때, 이전값을 넣는 변수는 for in문 바깥에 위치해야 한다.)

🤡. 실수한 부분
: itertools.permutation()에서 두번째 인자의 값을 '입출력 예'에 맞게 3으로 하드코딩해서
일부 테스트케이스에서 실패가 떴다.
이 부분은 len(dungeons)로 길이를 넣어줘야, 그 길이만큼 순서있게 조합한 결과를 얻을 수 있다.

Comments