프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다.
이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 "최소 필요 피로도", "소모 피로도"가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- k는 1 이상 5,000 이하인 자연수입니다.
- dungeons의 세로(행) 길이(즉, 던전의 개수)는 1 이상 8 이하입니다.
- dungeons의 가로(열) 길이는 2 입니다.
- dungeons의 각 행은 각 던전의 ["최소 필요 피로도", "소모 피로도"] 입니다.
- "최소 필요 피로도"는 항상 "소모 피로도"보다 크거나 같습니다.
- "최소 필요 피로도"와 "소모 피로도"는 1 이상 1,000 이하인 자연수입니다.
- 서로 다른 던전의 ["최소 필요 피로도", "소모 피로도"]가 서로 같을 수 있습니다.
입출력 예
k | dungeons | result |
80 | [[80,20],[50,40],[30,10]] | 3 |
입출력 설명
현재 피로도는 80입니다.
만약, 첫 번째 → 두 번째 → 세 번째 던전 순서로 탐험한다면
- 현재 피로도는 80이며, 첫 번째 던전을 돌기위해 필요한 "최소 필요 피로도" 또한 80이므로, 첫 번째 던전을 탐험할 수 있습니다. 첫 번째 던전의 "소모 피로도"는 20이므로, 던전을 탐험한 후 남은 피로도는 60입니다.
- 남은 피로도는 60이며, 두 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 50이므로, 두 번째 던전을 탐험할 수 있습니다. 두 번째 던전의 "소모 피로도"는 40이므로, 던전을 탐험한 후 남은 피로도는 20입니다.
- 남은 피로도는 20이며, 세 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 30입니다. 따라서 세 번째 던전은 탐험할 수 없습니다.
만약, 첫 번째 → 세 번째 → 두 번째 던전 순서로 탐험한다면
- 현재 피로도는 80이며, 첫 번째 던전을 돌기위해 필요한 "최소 필요 피로도" 또한 80이므로, 첫 번째 던전을 탐험할 수 있습니다. 첫 번째 던전의 "소모 피로도"는 20이므로, 던전을 탐험한 후 남은 피로도는 60입니다.
- 남은 피로도는 60이며, 세 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 30이므로, 세 번째 던전을 탐험할 수 있습니다. 세 번째 던전의 "소모 피로도"는 10이므로, 던전을 탐험한 후 남은 피로도는 50입니다.
- 남은 피로도는 50이며, 두 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 50이므로, 두 번째 던전을 탐험할 수 있습니다. 두 번째 던전의 "소모 피로도"는 40이므로, 던전을 탐험한 후 남은 피로도는 10입니다.
따라서 이 경우 세 던전을 모두 탐험할 수 있으며, 유저가 탐험할 수 있는 최대 던전 수는 3입니다.
풀이
문제에서 주어진 건 현재 피로도와 [최소피로도, 소모피로도] 배열 입니다. 현재 피로도가 최소 피로도 보다 크면 통과 시키고, 통과 시키면서 소모피로도를 차감합니다. 이를 간단한 순서도로 그려봅니다.
추가적인 조건으로 한 번 갔던 던젼을 재탐색할 수 없습니다. 이를 반영해서 코드를 작성해봅시다.
var answer: Int = 0
var max = -1
fun solution(k: Int, dungeons: Array<IntArray>): Int {
var t = k
dungeons.forEach{ i ->
//현재 피로도 >= 최소 피로도
if(t >= i[0]) {
t -= i[1]
answer++
if(answer > max)
max = answer
solution(t, dungeons.filter { it != i }.toTypedArray())
t+=i[1]
answer--
}
}
return max
}
인스턴스 변수 answer, max 를 만들어 줍니다. 각자 누적되는 던전 탐색 횟수와 최대 탐색 횟수를 저장합니다.
던전을 탐색하는데 현재 피로도가 최소 피로도 보다 크거나 같을 경우에만 탐색 합니다.
탐색시 현재 피로도 t에서 소모 피로도 i[1]을 차감하고 던전 탐색 횟수 answer을 증가시킵니다.
만약 던전 탐색 횟수 answer이 최대 탐색 횟수 max보다 크다면 할당해줍니다.
재귀를 하되 내가 탐색한 던전을 제외하고 탐색해야하므로 filter함수에 내가 탐색한 던전 i를 걸러줍니다.
재귀함수에서 리턴받아 돌아왔을 때 다음 루프를 위해 던전 탐색 횟수 answer과 현재 피로도 t를 원상복구해줍니다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
롤케이크 자르기(Lv.2) (0) | 2022.10.28 |
---|---|
모음사전(Lv.2) (1) | 2022.10.13 |
오픈채팅방(Lv.2) (0) | 2022.10.11 |
프린터(Lv.2) (0) | 2022.10.10 |
기능개발(Lv.2) (0) | 2022.10.09 |