https://school.programmers.co.kr/learn/courses/30/lessons/172927
문제
광물 / 곡괭이 배열이 주어졌을 때
곡괭이를 임의로 선택해서 광물을 캘 때 피로도의 최소값을 출력하는 문제
풀이
다이어 / 철 / 돌 곡괭이 모두 확인해야하므로 DFS 를 사용해서 풀었다.
곡괭이는 5개의 광석을 캐면 더 이상 사용하지 못하므로 index 가 5가 될 때 다음 곡괭이를 선택해주었다.
class Solution {
static int min = Integer.MAX_VALUE;
public int solution(int[] picks, String[] minerals) {
int answer = 0;
int dia = picks[0];
int iron = picks[1];
int stone = picks[2];
if (dia > 0)
dfs(0, "d", 0, minerals, dia-1, iron, stone);
if (iron > 0)
dfs(0, "i", 0, minerals, dia, iron-1, stone);
if (stone > 0)
dfs(0, "s", 0, minerals, dia, iron, stone-1);
return min;
}
public void dfs(int fatigue, String tool, int index, String[] minerals, int dia, int iron, int stone) {
if ( index >= minerals.length ) {
min = Math.min(min, fatigue);
return;
}
if (minerals[index].equals("diamond")) {
if ("d".equals(tool)) {
fatigue += 1;
} else if ("i".equals(tool)) {
fatigue += 5;
} else {
fatigue += 25;
}
} else if (minerals[index].equals("iron")) {
if ("d".equals(tool)) {
fatigue += 1;
} else if ("i".equals(tool)) {
fatigue += 1;
} else {
fatigue += 5;
}
} else if (minerals[index].equals("stone")) {
if ("d".equals(tool)) {
fatigue += 1;
} else if ("i".equals(tool)) {
fatigue += 1;
} else {
fatigue += 1;
}
}
if ((index + 1) % 5 == 0) {
if ((dia == 0 && iron == 0 && stone == 0) ) {
min = Math.min(min, fatigue);
return;
}
if (dia > 0) {
dfs (fatigue, "d", index+1, minerals, dia-1, iron, stone);
}
if (iron > 0) {
dfs(fatigue, "i", index+1, minerals, dia, iron-1, stone);
}
if (stone > 0) {
dfs(fatigue, "s", index+1, minerals, dia, iron, stone-1);
}
} else {
dfs(fatigue, tool, index+1, minerals, dia, iron, stone);
}
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 2023 KAKAO BLIND - 표현 가능한 이진트리 (자바) (0) | 2023.04.21 |
---|---|
[프로그래머스] 2023 KAKAO BLIND 코딩테스트 - 이모티콘 할인행사 (0) | 2023.04.20 |
[프로그래머스] 마법의 엘리베이터(자바) (0) | 2023.04.18 |
[프로그래머스] 2023 KAKAO BLIND - 택배 배달과 수거하기 (자바) (0) | 2023.04.17 |
[프로그래머스] 연속된 부분 수열의 합 (자바) (1) | 2023.04.13 |