반응형
코딩테스트 연습 - 광물 캐기 | 프로그래머스 스쿨 (programmers.co.kr)
<문제 풀이>
- 가지고 있는 곡괭이 * 5개까지만 체크
- 입력된 광물 list를 5개씩 어떤 광물인지 카운팅 하여 재정의
- 카운팅한 광물 list를 우선순위(다이아몬드 - 철 - 돌)에 따라 정렬
- 곡괭이도 마찬가지로 다이아몬드 - 철 - 돌 순서로 사용. 모두 소진 시 다른 재료 곡괭이 사용
<Code>
def solution(picks, minerals):
answer = 0
num = {'diamond': 0, 'iron': 1, 'stone': 2} # 광물: idx
fatigue = [[1, 1, 1], [5, 1, 1], [25, 5, 1]] # 각 곡괭이로 광물을 캘 때의 피로도
minerals = minerals[:5 * sum(picks)] # 곡괭이당 5개의 광물을 캐기 때문에 캘 수 있는 해당 개수까지 slicing
check = [] # 5개의 광물을 캤을 때 각 광물의 수 ex) [[다아이몬드 수, 철 수, 돌 수],...]
idx = 0 # idx
cnt = 1 # 5개 광물 체크하기 위한 변수
temp = [0, 0, 0] # 각 광물당 카운팅
while idx < len(minerals):
if cnt > 5: # 하나의 곡괭이로 캘수 있는 광물을 다 채웠다면 각 변수들 초기화
check.append(temp)
cnt = 1
temp = [0, 0, 0]
temp[num[minerals[idx]]] += 1 # 광물 카운트
cnt += 1
idx += 1
if sum(temp): # 마지막으로 카운팅한 것 check에 넣어주기
check.append(temp)
# 다이아몬드 철 돌 순으로 피로도가 높기때문에 다이아몬드, 철, 돌이 많은 순으로 정렬한다.
# 이후 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이 순으로 소진하며 체크
check.sort(key=lambda x: (-x[0], -x[1], -x[2]))
# 다이아몬드, 철, 돌 순으로 곡괭이를 먼저 소진하기 위에 pick 순서대로 해당 곡괭이 개수만큼 곡괭이 번호 넣는다.
pick = []
for i in range(3):
pick += [i] * picks[i]
pi = 0 # 사용되는 곡괭이의 idx
for i in range(len(check)):
for j in range(3):
answer += fatigue[pick[pi]][j] * check[i][j] # 하나의 곡괭이를 소진했을 때 발생하는 피로도 누적
pi += 1
return answer
import java.util.*;
class Solution {
public int solution(int[] picks, String[] mines) {
int answer = 0;
HashMap<String, Integer> mineralNum = new HashMap<>();
mineralNum.put("diamond", 0);
mineralNum.put("iron", 1);
mineralNum.put("stone", 2);
int[][] fatigue = {{1, 1, 1}, {5, 1, 1}, {25, 5, 1}};
ArrayList<int[]> check = new ArrayList<>();
ArrayList<String> minerals = new ArrayList<>();
int t = 0;
while (t < mines.length) {
if (Arrays.stream(picks).sum() * 5 <= t) {
break;
}
minerals.add(mines[t]);
t++;
}
int idx = 0;
int cnt = 1;
int[] temp = {0, 0, 0};
while (idx < minerals.size()) {
if (cnt > 5) {
check.add(temp);
cnt = 1;
temp = new int[]{0, 0, 0};
}
temp[mineralNum.get(minerals.get(idx))]++;
cnt++;
idx++;
}
if (Arrays.stream(temp).sum() > 0) {
check.add(temp);
}
check.sort(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o2[0] - o1[0];
} else if (o1[1] != o2[1]) {
return o2[1] - o1[1];
} else {
return o2[2] - o1[2];
}
}
});
ArrayList<Integer> pick = new ArrayList<>();
for (int i = 0; i < 3; i++) {
int c = 0;
while (c < picks[i]) {
pick.add(i);
c++;
}
}
int pi = 0;
for (int i = 0; i < check.size(); i++) {
for (int j = 0; j < 3; j++) {
answer += (fatigue[pick.get(pi)][j] * check.get(i)[j]);
}
pi++;
}
return answer;
}
}
※ 잘못된 점, 개선점 등이 있다면 언제든 댓글로 알려주시면 감사하겠습니다.
반응형
'Alogorithm > programmers' 카테고리의 다른 글
[programmers] Lv2 무인도 여행 - Python (0) | 2023.03.28 |
---|---|
[programmers] Lv2 호텔 대실 - Python (0) | 2023.03.28 |
[programmers] Lv3 인사고과 - Python (0) | 2023.03.24 |
[programmers] Lv3 고고학 최고의 발견 - Python (0) | 2023.03.21 |
[programmers] Lv3 풍선 터트리기 - Python (0) | 2023.03.20 |