RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스 > Lv2] 광물캐기

2023. 3. 27. 17:21
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제

곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하여, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복합니다.

 

[입력]

  • 곡갱이의 개수를 나타내는 정수 배열 picks
  • 광물들의 순서를 나타내는 문자열 배열 materials

[결과]

작업을 끝내기까지 필요한 최소한의 피로도를 return

 

2. 풀이

🌹 완전탐색으로 풀 수 있는 문제입니다.

먼저 문제를 풀기 전에 필요한 정보를 먼저 준비하도록 하겠습니다.

 

2.1 곡갱이별 피로도
private val needs = arrayOf(
    arrayOf(1, 1, 1),
    arrayOf(5, 1, 1),
    arrayOf(25, 5, 1)
)
2.2 광물의 index

광물이 String형식으로 제공되기 때문에 이를 코드 내에서 사용하기 쉽도록 index로 바꿔주는 Map을 추가하도록 하겠습니다. 🤗

private val stones = mapOf(
	"diamond" to 0, 
    "iron" to 1,
    "stone" to 2
)

 

이제 완전탐색을 하며 피로도가 가장 낮은 경우를 찾으면 됩니다. 👍🏻

이 때, 탐색을 종료하는 조건은

  1. 모든 광물을 다 캔 경우
  2. 모든 곡괭이를 다 쓴 경우
  3. 지금까지의 피로도가 이전에 구했던 최소 피로도보다 큰 경우 더 이상 탐색할 필요 없음

위 3가지를 코드로 나타내면 아래와 같습니다.

if (index >= minerals.size) {
    answer = min(answer, total)
    return
}
if (picks.all { it == 0 }) {
    answer = min(answer, total)
    return
}
if (answer <= total) return

 

3. 코드

Kotlin
import kotlin.math.min
class Solution {
    private val needs = arrayOf(
        arrayOf(1, 1, 1),
        arrayOf(5, 1, 1),
        arrayOf(25, 5, 1)
    )
    private val stones = mapOf("diamond" to 0, "iron" to 1, "stone" to 2)
    private var answer: Int = Int.MAX_VALUE
    fun solution(picks: IntArray, minerals: Array<String>): Int {
        solve(0, picks, minerals, 0)
        return answer
    }

    private fun solve(
        index: Int,
        picks: IntArray,
        minerals: Array<String>,
        total: Int
    ) {
        if (index >= minerals.size) {
            answer = min(answer, total)
            return
        }
        if (picks.all { it == 0 }) {
            answer = min(answer, total)
            return
        }
        if (answer <= total) return

        for (pick in 0 until 3) {
            if (picks[pick] > 0) {
                picks[pick]--
                solve(
                    index + 5, picks,
                    minerals,
                    total + calc(pick, index, minerals)
                )
                picks[pick]++
            }
        }
    }

    private fun calc(
        pick: Int,
        start: Int,
        minerals: Array<String>
    ): Int {
        var result = 0
        for (i in 0 until 5) {
            if (start + i >= minerals.size) return result
            val mineral = minerals[start + i]
            result += needs[pick][stones[mineral] ?: 0]
        }
        return result
    }
}

 

 

반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스>LV1] 추억점수(Kotlin)  (0) 2023.03.31
[프로그래머스>LV1] 공원산책(Python)  (0) 2023.03.31
[프로그래머스 > Lv2] 리코챗 로봇  (0) 2023.03.22
[프로그래머스 > Lv4] 지형이동  (0) 2023.03.16
[프로그래머스 > Lv4] 가사 검색  (0) 2023.03.14
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스>LV1] 추억점수(Kotlin)
    • [프로그래머스>LV1] 공원산책(Python)
    • [프로그래머스 > Lv2] 리코챗 로봇
    • [프로그래머스 > Lv4] 지형이동
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바