728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/172927
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해설
작업이 끝날때의 최소 피로도를 구하는 문제입니다.
광물을 순서대로 캐야하며, 광물의 순서에 규칙이 있는 것이 아니여서 완전탐색이 필요합니다. 또한 모든 가지수를 대입할 때 최대 광물의 수 50, 곡괭이는 각각 5개씩이므로 각 곡괭이의 선택 경우의수는 3의 10제곱정도라 시간, 공간 복잡도에 무리가 가지 않고 문제를 해결할 수 있습니다.
arr 이차원 배열을 통해 [곡괭이][광물] 인 경우의 피로도를 바로 얻을 수 있도록 하였습니다.
dfs를 통해 곡괭이의 남은 개수와 현재까지 채취한 광물의 수, 적용된 피로도를 넘기며 연산하다가 곡괭이를 모두 쓴 경우(pick_sum 이 0인 경우), 또는 모든 광물을 채취한 경우(index가 minerals의 개수만큼 된 경우)에 종료하여 각 시점의 피로도와 비교하는 형식으로 문제를 해결하였습니다.
코드
class Solution {
int min = Integer.MAX_VALUE;
int[][] arr = {
{1,1,1},
{5,1,1},
{25,5,1}
};
int pick_sum;
public int solution(int[] picks, String[] minerals) {
int answer = 0;
pick_sum = picks[0]+picks[1]+picks[2];
dfs(picks,minerals,0,0);
answer = min;
return answer;
}
int mineralsToInt(String mineral){
if(mineral.equals("diamond")) return 0;
else if(mineral.equals("iron"))return 1;
else return 2;
}
public void dfs(int[] picks, String[] minerals, int minerals_index, int sum){
if(pick_sum==0||minerals_index==minerals.length) {
min = Math.min(min, sum);
return;
}
// 다이아 곡괭이 사용
if(picks[0]>0){
picks[0]--;
pick_sum--;
int i=0;
int add = 0;
for(i=minerals_index;i<minerals_index+5;i++){
if(i==minerals.length)break;
add += arr[0][mineralsToInt(minerals[i])];
}
dfs(picks, minerals, i,sum+add);
picks[0]++;
pick_sum++;
}
// 철 곡괭이 사용
if(picks[1]>0){
picks[1]--;
pick_sum--;
int i=0;
int add = 0;
for(i=minerals_index;i<minerals_index+5;i++){
if(i==minerals.length)break;
add += arr[1][mineralsToInt(minerals[i])];
}
dfs(picks, minerals,i,sum+add);
picks[1]++;
pick_sum++;
}
// 돌 곡괭이 사용
if(picks[2]>0){
picks[2]--;
pick_sum--;
int i=0;
int add = 0;
for(i=minerals_index;i<minerals_index+5;i++){
if(i==minerals.length)break;
add += arr[2][mineralsToInt(minerals[i])];
}
dfs(picks, minerals, i,sum+add);
picks[2]++;
pick_sum++;
}
}
}
728x90
'[IT] 코딩테스트 > [문제 및 풀이] 프로그래머스' 카테고리의 다른 글
[프로그래머스] 두 원 사이의 정수 쌍 / 자바(Java) (2) | 2023.10.19 |
---|---|
[프로그래머스] 요격 시스템 / 자바(Java) (2) | 2023.10.18 |
[프로그래머스] 피로도 / 자바(Java) (0) | 2023.09.07 |
[프로그래머스] 할인 행사 / 자바(Java) (0) | 2023.09.06 |
[프로그래머스] 연속 부분 수열 합의 개수 / 자바(Java) (0) | 2023.09.05 |