개발/CS study
[프로그래머스] BFS(or 완전탐색), 피로도
물만난동그리
2023. 5. 6. 15:48
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/87946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 개요
input
k: 현재 피로도 (1이상 5000이하 자연수)
2차원 배열 dungeons: [["최소 필요 피로도", "소모 피로도"], [],...]
*"최소 필요 피로도" >= "소모 피로도"
*각 값은 1이상 1000이하 자연수
*dungeons 내 원소 중복 가능.
ex) [[80,20],[50,40],[30,10]]
output
유저가 탐험할 수 있는 최대 던전 수
*k값이 0이상일 때까지 반복.
배열의 문제.
어떻게 배열해야 최대한 많은 개수의 던전을 탐험할 수 있을까.
구현 아이디어
BFS (queue 활용)
https://lets-hci-la-ai-withme.tistory.com/51
[알고리즘] BFS, 너비 우선 탐색
그래프 탐색 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것 -> 두 점을 연결하는 길이 있는가? 이를 확인하기 위해 하나씩 방문. (특정 도시에서 다른 도시로 갈 수
lets-hci-la-ai-withme.tistory.com
- 시작정점을 default((k, []))로 고정하고
BFS 기반으로 - for문 통해 그다음 노드를 선택(단, 조건 충족하는 것만 queue에 인큐) - graph는 주어진 2차원 배열 dungeons 사용
- node(첫 시작)을 (k, [])로 지정함.
- k: (현재 업데이트된) k값
- [] : visited 역할을 하는 'route'. 어떤 노드를 거쳤는지 노드 인덱스 남기는 리스트. default는 빈 리스트.
- queue 생성 필수: queue = deque()
- while queue
- 중심 축(매번 업데이트되는 시작 정점)은 queue에서 popleft한 것. (k, route)
- 그 안에서 for문으로 처리
- 그다음 탐색할 노드(두 가지 조건 충족 )를 queue에 저장하거나
- 조건 충족 안 할 경우, max 활용하여 answer 업데이트
- 그 안에서 for문으로 처리
from collections import deque
def solution(k, dungeons):
answer = -1
queue = deque()
queue.append((k, []))
while queue:
k, route = queue.popleft()
for i in range(len(dungeons)):
a, b = dungeons[i]
if (k>=a) and (i not in route):
temp = route + [i]
queue.append(((k-b),temp))
else:
answer = max(answer, len(route))
return answer
좋은 아이디어
복습복습복습!
728x90