알고리즘/PROGRAMMERS
피로도(Lv.2)
현대타운301
2024. 3. 22. 17:10
문제 설명
입출력 예시
요약
던전을 최대로 많이 돌 수 있는 경우의 수 구하기
풀이
접근 방식
1. 완전탐색을 위한 모든 경우의 수 구하기
→ 던전의 개수가 3개인 경우: 012, 021, 102, 120, 201, 210
코드리뷰
import java.util.*;
class Solution {
HashSet<String> set = new HashSet<>();
// 모든 경우의 수를 구하는 재귀함수
public void recursive(String comb, String remains, int maxLength) {
if(!comb.isBlank() && comb.length() == maxLength) {
set.add(comb);
}
for(int i = 0; i < remains.length(); i++) {
recursive(comb + remains.substring(i, i+1), // remains의 첫 번째 문자 떼서 다음 재귀함수의 첫 번째 인자로 넘김
remains.substring(0, i) + remains.substring(i+1), // 해당 문자를 제외한 나머지 문자열을 두 번째 인자로 넘김
maxLength); // 던전의 개수를 문자열의 maxLength로 전달
}
}
public int solution(int k, int[][] dungeons) {
List<Integer> answerList = new ArrayList<>();
String substr = "";
for(int i = 0; i < dungeons.length; i++) {
substr += String.valueOf(i); // 'length = 던전의 개수'인 숫자 문자열 생성
}
recursive("", substr, substr.length()); // 경우의 수 구하는 재귀함수 호출
for(String val : set) {
int tired = k; // 피로도
int count = 0; // 던전 카운트
for(int i = 0; i < val.length(); i++) { // 각 경우의 수를 전부 탐색
if(tired >= dungeons[Integer.valueOf(val.substring(i, i+1))][0]) { // 피로도가 최소 피로도 이상이면
tired -= dungeons[Integer.valueOf(val.substring(i, i+1))][1]; // 던전 돌고 피로도 감소
count++; // 던전 카운트 증가
} else { // 피로도가 최소 피로도 미만이면
break; // 해당 경우의 수 탈출
}
}
answerList.add(count); // 던전을 돌 수 있을만큼 돌고 난 후 던전 카운트를 list에 add
}
int answer = Collections.max(answerList); // 던전 카운트 중 최댓값 구하기
return answer;
}
}