https://school.programmers.co.kr/learn/courses/30/lessons/172927
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 접근
1. 곡괭이 1개 => 5개의 광물 캐기 가능
2. 주어진 곡괭이로 캘 수 있는 광물만큼 자르기
3. 연속해서 5개를 캐야하므로 5개씩 광물을 잘라 새로운 배열에 저장
4. 다이아 > 철 > 돌 순서대로 정렬해야 최소한의 피로도로 작업 끝내기 가능
코드
def solution(picks, minerals):
answer = 0
sum = 0
# 곡괭이의 수
for pick in picks:
sum += pick
# 주어진 곡괭이로 캘 수 있는 광물만큼 커팅
num = sum * 5
if len(minerals) > sum:
minerals = minerals[:num]
# minerals의 광물들을 5개의 단위로 분류하고, 각 그룹 내에서 다이아몬드, 철, 돌의 개수를 세어 새로운 리스트에 저장
new_minerals = [[0, 0, 0] for _ in range(len(minerals)//5+1)]
for i in range(len(minerals)):
if minerals[i] == 'diamond':
new_minerals[i//5][0] += 1
elif minerals[i] == 'iron':
new_minerals[i//5][1] += 1
elif minerals[i] == 'stone':
new_minerals[i//5][2] += 1
# 광물을 다이아몬드, 철, 돌 순서대로 정렬(핵심)
# 광물은 무조건 5개씩 연속으로 캔다.(조건1)
# 5개를 채굴할 때마다 곡괭이 선택
new_minerals.sort(key=lambda x:(-x[0], -x[1], -x[2]))
for i in new_minerals:
dia, iron, stone = i
for j in range(len(picks)):
if picks[j] > 0 and j == 0:
picks[j] -= 1
answer += dia + iron + stone
break
elif picks[j] > 0 and j == 1:
picks[j] -= 1
answer += 5*dia + iron + stone
break
elif picks[j] > 0 and j == 2:
picks[j] -= 1
answer += 25*dia + 5*iron + stone
break
return answer
문제 회고
생각보다 조건이 많은 문제였다. 특히 5개의 단위로 자른 후 또 그 안에서 다이아, 철, 돌로 나눠서 카운트하는데 이는 다이아 > 철 > 돌 순서대로 정렬하기 위한 과정이다. 그리고 이후에는 반복문을 돌면서 표에 나온 피로도를 적절하게 반영해 주는 과정만 거치면 문제는 간단하게 풀린다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]Lv3. 있었는데요 없었습니다(SQL) (0) | 2024.03.14 |
---|---|
[프로그래머스]Lv3. 없어진 기록 찾기(SQL) (0) | 2024.03.14 |
[프로그래머스]Lv1. 개인정보 수집 유효기간(Python) (2) | 2024.03.14 |
[프로그래머스]Lv2. 두 큐 합 같게 만들기(Python) (0) | 2024.03.07 |
[프로그래머스]Lv3. 파괴되지 않은 건물(Python) (4) | 2024.03.07 |