본문 바로가기
코딩테스트 파이썬/파이썬 프로그래머스 2단계

광물 캐기

by 세용용용용 2024. 7. 5.

업데이트 사항

수정 : 2024-07-05 [시간 복잡도 추가]

 

코딩테스트 연습 - 광물 캐기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

나의 코드

# 2024-07-05
def make_pick_dict(picks):
    answer={}
    for i in range(len(picks)):
        if i==0:
            key_name='diamond'
        elif i==1:
            key_name='iron'
        else:
            key_name='stone'

        answer[key_name]=picks[i]
    return answer

# 피로도 계산하는 함수
def pirodo_cl(now_pick, now_mir_list):
    answer = 0
    for i in now_mir_list:
        if now_pick=='diamond':
            answer+=1
        elif now_pick=='iron':
            if i=='diamond':
                answer+=5
            else:
                answer+=1
        else:
            if i=='diamond':
                answer+=25
            elif i=='iron':
                answer+=5
            else:
                answer+=1
    return answer

def solution(picks, minerals):
    answer = 0
    pick_dict = make_pick_dict(picks)
    
    seq_mineral = []
    for i in range(0,len(minerals), 5):
        seq_mineral.append(minerals[i:i+5])
    # 곡괭이가 부족할수도 있으니 캘수있는것만
    seq_mineral = seq_mineral[:sum(picks)]
    # 다이아, 돌, 아이언 많은 순으로 정렬
    seq_mineral = sorted(seq_mineral, key=lambda x:(x.count('diamond'), x.count('iron'), x.count('stone')), reverse=True)
    # 정렬된 리스트를 순회하며 피로도 계산
    for now_mir_list in seq_mineral:
        if pick_dict['diamond']>0:
            now_pick = 'diamond'
        elif pick_dict['iron']>0:
            now_pick = 'iron'
        else:
            now_pick = 'stone'
        
        pick_dict[now_pick]-=1

        answer+=pirodo_cl(now_pick, now_mir_list)
    
    return answer

 

 

시간 복잡도

1. 사전 만들기 : 크기가 3으로 고정 (상수시간)
2. seq_mineral 리스트 만들기 : minerals 리스트를 순회하며 만드므로 (선형시간)
3. seq_mineral 자르기 : sum(picks) 만큼 자르므로 (선형시간)
4. seq_mineral 정렬 : 정렬이므로 (선형로그시간)
5. 피로도 계산 : seq_mineral 리스트 순회하며 계산하므로 (선형시간)

 

최악의 경우 시간복잡도는 : 선형로그시간 ( O(nlogn) )

'코딩테스트 파이썬 > 파이썬 프로그래머스 2단계' 카테고리의 다른 글

과제 진행하기  (0) 2024.07.09
후보키  (0) 2024.07.08
우박수열 정적분  (0) 2024.07.04
멀쩡한 사각형  (0) 2024.07.03
문자열 압축  (2) 2024.07.02