프로그래머스 172927번 문제인 "광물 캐기" Lv.2을 파이썬으로 풀어보도록 하겠습니다.
[프로그래머스] 광물 캐기 Lv.2 - [파이썬/python]
💻 문제 설명
마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.
- 사용할 수 있는 곡괭이중 아무거나 하나를 선택해 광물을 캡니다.
- 한 번 사용하기 시작한 곡괭이는 사용할 수 없을 때까지 사용합니다.
- 광물은 주어진 순서대로만 캘 수 있습니다.
- 광산에 있는 모든 광물을 캐거나, 더 사용할 곡괭이가 없을 때까지 광물을 캡니다.
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks
와 광물들의 순서를 나타내는 문자열 배열 minerals
가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 반환(return) 하는 solution 함수를 완성해주세요.
🚨 제한사항
picks
는 [dia, iron, stone]과 같은 구조로 이루어져 있습니다.- 0 ≤ dia, iron, stone ≤ 5
- dia는 다이아몬드 곡괭이의 수를 의미합니다.
- iron은 철 곡괭이의 수를 의미합니다.
- stone은 돌 곡괭이의 수를 의미합니다.
- 곡괭이는 최소 1개 이상 가지고 있습니다.
- 5 ≤
minerals
의 길이 ≤ 50minerals
는 다음 3개의 문자열로 이루어져 있으며 각각의 의미는 다음과 같습니다.- diamond : 다이아몬드
- iron : 철
- stone : 돌
!!!정답 주의!!!
🌟 소스 코드
⏱ 시간복잡도
위 코드의 시간복잡도는 O(n log n)입니다.
변수 할당: fatigue = 0
, diamond_pickax, iron_pickax, stone_pickax = picks
변수 할당은 상수 시간, 즉 O(1)의 시간 복잡도를 가집니다.
리스트 슬라이싱 및 정렬: minerals = [minerals[i:i+5] for i in range(0, len(minerals), 5)][:sum(picks)]
리스트 슬라이싱은 O(n)의 시간 복잡도를 가지며, 이후에 이루어지는 정렬 작업은 O(n log n)의 시간 복잡도를 가집니다. 여기서 n은 광물의 수입니다.
반복문 순회: for mineral in minerals:
모든 광물을 순회하는 데는 O(n)의 시간이 소요됩니다.
조건문 확인: if diamond_pickax > 0:, elif iron_pickax > 0:, elif stone_pickax > 0:
조건문 확인은 상수 시간, 즉 O(1)의 시간 복잡도를 가집니다.
따라서, 이 코드의 전체 시간 복잡도는 O(n + n log n + n + 1)입니다. 그러나 보통 복잡도에서는 가장 큰 항만을 고려하므로, 이 코드의 시간 복잡도는 O(n log n)으로 간주할 수 있습니다. 이는 입력 크기에 대해 로그 선형적으로 비례하는 시간 복잡도를 의미합니다.
🏳🌈 테스트 결과
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 전화번호 목록 - Lv.2 (46) | 2023.11.09 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 - Lv.2 (48) | 2023.11.08 |
[프로그래머스] 과제 진행하기 - Lv.2 (42) | 2023.11.02 |
[프로그래머스] 구명보트 - Lv.2 (49) | 2023.11.01 |
[프로그래머스] 괄호 회전하기 - Lv.2 (49) | 2023.10.30 |