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 업데이트
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

+ Recent posts