[Programmers] 광물캐기 Lv2 + 회고

Jihoon·2023년 6월 8일
0

알고리즘

목록 보기
14/14
  • 간단한 회고부터 시작하겠습니다

    네이버 부캠 4기 수료한 이후, 2월은 게임듀오라는 회사에서 스카우트 제안이 와서 약 3주 정도 2차 면접까지 열심히 준비를 했다.... 결과는 비록 좋진 않았지만,,,
    이후, 3월 부터 5월 초 까진 18개의 기업에 대한 서류를 지원하였다..
    그중 4개 기업에 대해서는 코테와 AI 면접을 모두 통과하고 1차 면접을 볼 수 있었다 !
    결과는,,, 모두 탈락!! 그래서, 내가 과연 부족한 것이 무엇인지 하나씩 파악했다 ...!
    가장 중요한 원인은 서류를 지원할 때 굉장히 포괄적으로(걍 ㅈㄴ 못씀) 작성하였고, 이러한 자소서를 가지고 면접에서 질문을 받으려니 면접관 입장에서도 질문거리가 없었다... 이것이 서류 탈락 ~ 1차 면접에서 모두 탈락 ~ 의 원인이라고 생각한다..(즉, 내 능력과 경험, 그리고 내 자신을 글로써 제대로 표현을 못해서 인사담당자 입장에서도 판단을 잘할 수 없었던 것이지..)
    이후, 6월 현재, 현대카드, KB 증권 두 기업에 대해서는 자소서를 싸악 갈아버리고 새로운 마음으로 지원을 했다! (면접왕이형 구독, 좋아요, 도서 구매 필수 !)
    여하튼, 한 동안 면접에 의해 놓고 있던 코테를 다시 감을 잡아야하기 때문에 이와 같이 필요할 때 마다 Velog를 들리려는 계획이다..ㅎ)
    전국의 모든 취준생들 화이팅!!

광물캐기 Lv2 - 백트래킹

  • 문제 요약

광물을 캐려는 데 곡괭이 3종류가 있으며, 광물 역시 3종류가 있다. 이때, 곡괭이 별로 광물캐는 피로도가 다른데, 모든 경우의 수를 파악해서 피로도가 가장 적은 경우의 결과 값을 구하는 문제 !

  • 풀지 못한 원인

백트래킹의 감을 다.. 잃었다.. 2달 정도 놓았더니 싸악 사라졌다.. 이론과 어떻게 적용할 지 느낌만 있을 뿐.. 써야되는데...하고 나락에 간 느낌

  • Solution 1 : 구현으로 푼 경우
def solution(picks, minerals):
    sum = 0
    for x in picks:
        sum += x
    
    # 캘 수 있는 광물의 개수
    num_min = sum * 5
    if len(minerals) > num_min: # 주어진 광물이 캘 수 있는 광물 수보다 크면
        minerals = minerals[:num_min]
        
    # 광물 조사 -> 50개 까지 가능하니까 크기 10인 이중 리스트
    cnt_min = [[0, 0, 0]for x in range(10)] # dia, iron, stone
    # 5개 까지 캘 수 있으니 5의 몫(index)
    for i in range(len(minerals)):
        if minerals[i] == 'diamond': 
            cnt_min[i//5][0] += 1
        elif minerals[i] == 'iron': 
            cnt_min[i//5][1] += 1
        else : 
            cnt_min[i//5][2] += 1

    # 피로도가 높은 순서대로 광물 정렬
    sorted_cnt_min = sorted(cnt_min, key = lambda x: (-x[0], -x[1], -x[2]))
    
    # 피로도 계산
    answer = 0
    for mineral in sorted_cnt_min:
        d, i, s = mineral
        for p in range(len(picks)):
            if p == 0 and picks[p]>0: # dia 곡괭이
                picks[p]-=1
                answer += d + i + s
                break
            elif p == 1 and picks[p]>0: # iron 곡괭이
                picks[p]-=1
                answer += 5*d + i + s
                break
            elif p == 2 and picks[p]>0: # stone 곡괭이
                picks[p]-=1
                answer += 25*d + 5*i + s
                break
                
    return answer

광물의 피로도가 높은 순서대로 하고, 곡괭이도 조건 문을 피로도 낮게 캐는 것들로 순서대로 구현해서 차례대로 처리하는 ... 음 ,, 구현은 역시 대단하다 !

  • Solution 2: 백트래킹으로 푼 경우
a=[[1,1,1],[5,1,1],[25,5,1]]
res=987654321
m=dict()
m["diamond"]=0
m["iron"]=1
m["stone"]=2
 
# DFS 함수 구현
def go(idx, d, ir, s, minerals, p):
    # 종료 조건
    # 모든 광물을 캤거나 남은 도구가 없을때
    if idx >= len(minerals) or (not d and not ir and not s):
        global res
        # 현재까지 구한 값과 최솟값을 비교하여 갱신
        res = min(res, p)
        return
 
    dp = 0
    ip = 0
    sp = 0
    # 다음 5개의 광물에 대하여 더해준다.
    for i in range(idx, min(idx+5, len(minerals))):
        dp += a[0][m[minerals[i]]]
        ip += a[1][m[minerals[i]]]
        sp += a[2][m[minerals[i]]]
 
    # 다이아몬드를 채취하는 경우
    if d:
        go(idx+5, d-1, ir, s, minerals, p+dp)
 
    # 철을 채취하는 경우
    if ir:
        go(idx+5, d, ir-1, s, minerals, p+ip)
 
    # 돌을 채취하는 경우
    if sp:
        go(idx+5, d, ir, s-1, minerals, p+sp)
 
 
# 문제 해결 함수 구현
def solution(picks, minerals):
    global res
    # DFS 시작
    go(0, picks[0], picks[1], picks[2], minerals, 0)
    return res

역시 백트래킹, DFS가 깔끔하고,, 내가 원했던,, 크으 굳
기가 막힌다 ! 정확히 이해하고 넘어가자 FLOW

profile
장난감이 데이터인 사람

0개의 댓글