코딩한걸음
728x90
반응형

Today I Learned


어떤 문제가 있었는지

# https://school.programmers.co.kr/learn/courses/30/lessons/133502
# 햄버거 만들기

# 문제 설명
# 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 
# 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 
# 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 
# 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.

# 예를 들어, 상수의 앞에 쌓이는 재료의 순서가 
# [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 
# 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 
# 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터
# 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.

# 상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 
# 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.

# 제한사항
# 1 ≤ ingredient의 길이 ≤ 1,000,000
# ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.

오늘 풀었던 문제 중에 제일 짜증났던 문제다

로직 자체를 구하는건 어렵지 않았는데 시간복잡도에서 자꾸 걸렸다

 

 


내가 시도해 본 것들

def solution(ingredient):
    arr = []
    answer = 0
    for i in ingredient:
        arr.append(i)
        if i == 1:
            if arr[-4:]==[1,2,3,1]:
                arr = arr[:-4]
                answer+=1
    return answer
    
def solution2(ingredient):
    answer = 0
    s = ''.join(map(str,ingredient))
    while True:
        s_idx = s.find('1231')
        if s_idx==-1: break
        answer+=1
        s=s[:s_idx]+s[s_idx+4:]
    return answer

어떤게 시간복잡도에서 더 이득일까 해봤는데 둘 다 속도는 비슷했다

 


어떻게 해결 했는지

def solution(ingredient):
    arr = []
    answer = 0
    for i in ingredient:
        arr.append(i)
        if i == 1:
            if arr[-4:]==[1,2,3,1]:
                # arr = arr[:-4]
                del arr[-4:]
                answer+=1
    return answer

arr = arr[:-4] 를 하는거보다 del arr[-4:] 를 하는게 시간/공간적으로 이득이라는것을 알았다

 

list의 slice는 요소 하나하나를 불러오는 방식이고

del은 list의 해당 인덱스의 연결을 끊어서 다음 인덱스로 붙여주는 방식이다

 

저번에 선발대 수업때 linked list에 대해 배웠었는데 그것의 작동방식하고 비슷한듯

확실히 그렇게 생각하면,

 

arr = arr[:-4] 는 0번째 인덱스부터 쭉 불러와야하는데

del arr[-4:] 은 뒤에서 4번째 인덱스의 연결만 끊으면 끝난다

 


무엇을 새롭게 배웠는지

list의 slice가 작동하는 방식과 del이 작동하는 방식

 

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!