heyjinn.dev
헤이지니
heyjinn.dev
  • 분류 전체보기 (66)
    • 알고리즘 💻 (21)
      • BOJ (12)
      • 요약정리 (6)
      • 과제 (3)
    • BackEnd 🌱 (13)
      • spring (13)
    • 📚study✨ (12)
      • Docker & Kubernetes (8)
      • 기타 (4)
    • ComputerScience 🐥 (8)
      • 운영체제 (0)
      • 컴퓨터네트워크 (8)
      • 데이터베이스 (0)
    • 에러 해결 👍 (6)
    • 후기 🔥 (4)
      • 세미나 (2)
      • 인턴 (0)
      • 프로젝트 (0)
    • 기타 (0)
    • 일상 (1)

인기 글

태그

  • 순열
  • dfs
  • AWS
  • 조합
  • 프로그래머스
  • 두 원 사이의 정수 쌍
  • Python
  • 백트래킹
  • EC2
  • 자바

최근 글

05-28 12:33
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
heyjinn.dev
[프로그래머스, Python] 광물 캐기
알고리즘 💻/BOJ

[프로그래머스, Python] 광물 캐기

2023. 10. 29. 16:51

정답 코드 

def solution(picks, minerals):
    ans = []
    tired = [[1, 1, 1],
             [5, 1, 1],
             [25, 5, 1]]
    tools = {"diamond" : 1, "iron": 2, "stone": 3}
    
    def dfs(minerals, picks, tired_rate):
        # 종료 조건
        if sum(picks) == 0 or minerals == []:
            ans.append(tired_rate)
            return
        m = minerals[:5]
        # tool 을 picks에서 감소
        for t in range(3):
            if picks[t] > 0:
                picks[t] -= 1
                tired_rate_val = tired_rate_calculate(t, m)
                dfs(minerals[5:], picks, tired_rate+tired_rate_val)
                picks[t] += 1

    def tired_rate_calculate(t, minerals):
        tired_rate = 0
        for m in minerals:
            tired_rate += tired[t][tools[m]-1]

        return tired_rate
    dfs(minerals, picks, 0)
    ans.sort()
    return ans[0]

 

풀이

문제를 보고, 그리디와 dfs가 떠올랐습니다. 좀 더 익숙한 dfs로 문제를 풀었고, 모든 경우를 탐색하면서 피로도(tired_rate)를 계산하는 코드를 작성했습니다. 

1. dfs를 돌면서 사용할 수 있는 도구가 있다면, 도구를 사용하여 mineral[:5]만큼의 피로도를 계산합니다. 

2. 더 이상 사용할 수 있는 도구가 없거나, mineral이 고갈되면 종료합니다. 

 

제출하면 테스트 케이스가 절반만 맞는 문제가 있었는데, dfs안의 코드를 아래와 같이 작성했었습니다.

	# tool 을 picks에서 감소
        for t in range(3):
            if picks[t] > 0:
                picks[t] -= 1
                tired_rate_val += tired_rate_calculate(t, m)
                dfs(minerals[5:], picks, tired_rate)
                # tired_rate_val을 빼주는 로직이 추가되어야 함 !!
                picks[t] += 1

잘 보시면, picks는 -1을 해 준뒤 +1을 해줘서 다음 dfs에 지장이 없게 했지만 tired_rate는 더하는 로직만 있고 빼주는 로직이 없어서 값들이 계속 누적되는 오류가 있었습니다.

for t in range(3):
    if picks[t] > 0:
        picks[t] -= 1
        tired_rate_val = tired_rate_calculate(t, m)
        dfs(minerals[5:], picks, tired_rate+tired_rate_val)
        picks[t] += 1

위와 같이 코드를 += 가 아닌, 새로운 값에 할당하여 더하는 식으로 구현하니 잘 돌아가는 모습을 볼 수 있었습니다. 

 

저작자표시 (새창열림)
    '알고리즘 💻/BOJ' 카테고리의 다른 글
    • [프로그래머스, Python] 두 원 사이의 정수 쌍
    • [프로그래머스, Python] 등굣길
    • [프로그래머스, Python] 게임 맵 최단거리
    • [프로그래머스, Python] 수식 최대화
    heyjinn.dev
    heyjinn.dev
    안녕하세요 ~ https://github.com/toki0411 부족하지만 열심히 공부중입니다 :D

    티스토리툴바