은공지능 공작소 :: [프로그래머스] 햄버거 만들기 파이썬 알고리즘 문제 풀이

안녕하세요. 은공지능 공작소의 파이찬입니다.
오늘 풀어볼 문제는 "햄버거 만들기" 라는 문제입니다.

고민해 볼 포인트가 많은 문제인데요,
리스트의 일부를 효율적으로 제거하는 방법이 중요합니다.
이에 대해서 중점적으로 설명드리겠습니다.

 

 

해당 문제 바로가기 ↓↓↓ 아래 링크 클릭

https://school.programmers.co.kr/learn/courses/30/lessons/133502

 

프로그래머스

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

programmers.co.kr

 

 

 

1. 정답 공개

바로 정답 공개하도록 하겠습니다.
그 이후에 시간초과가 걸리는 코드와 정답으로 통과한 코드를 비교해 보겠습니다.
먼저, 사람들이 가장 많이 채택한 정답입니다.
def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for _ in range(4):
                s.pop()
    return cnt

 

 

 

 

다음으로 시간초과로 통과할 수 없는 코드를 보여드리겠습니다.
위의 코드와 동일하나, 딱 한 줄이 다릅니다.
def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            s = s[:-4] # 해당 부분으로 인해 시간 초과 발생
    return cnt

 

 

 

 

 

2. Pop() 함수에 대한 이해

input_list = [1, 2, 3, 1]
input_list.pop()
print(input_list)
output
------------------------------------
[1, 2, 3]
.pop() 함수를 통해 리스트의 일부 요소를 제거할 수 있습니다.
[리스트 데이터].pop()을 사용하게 되면, 해당 리스트의 맨 마지막 요소가 제거됩니다.
이 때, 별도 변수에 리스트를 다시 할당할 필요가 없습니다.

 

 

 

input_list = [1, 2, 3, 1]
input_list.pop(0)
print(input_list)
output
------------------------------------
[2, 3, 1]
pop() 함수 안에 파라미터를 지정할 수도 있습니다.
pop 함수 안에 제거하고 싶은 리스트 요소의 인덱스 번호를 넣어주면,
리스트의 해당 요소만 제거됩니다.

위의 예시에서 pop안에 0이라고 했기 때문에,
리스트의 0번 index인 1이 제거되었습니다.

 

 

 

input_list = [1, 2, 3, 1]
a = input_list.pop(0)
print(input_list)
print('a:', a)
output
---------------------------------------
[2, 3, 1]
a: 1

 

리스트에서 튀어나온(pop) 녀석을 변수에 할당할 수도 있습니다.
위의 코드에서 튀어나온 녀석을 a라는 변수에 할당했는데요,
그래서 a의 값은 1이 됩니다.

 

 

 

def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for _ in range(4):
                s.pop()
    return cnt
다시 정답 코드로 돌아가 봅시다.
리스트의 마지막 4요소가 [1, 2, 3, 1] 이면, pop함수가 4번 실행되는 구조입니다.
따로 pop 함수에 인덱스를 지정해주지 않았기 때문에,
자동으로 마지막 요소가 4번 튀어나가 제거되는 원리입니다.

 

 

 

 

 

3. 다른 풀이 (del 이용)

del 함수를 이용하여 리스트의 일부를 강제로 지울 수도 있습니다.
시간은 실행할 때마다 달라져서, 비교가 어렵네요...
pop 보다 del을 이용하는게 더 코드가 짧습니다.
def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            del s[-4:]
    return cnt

 

 

 

 

 

4. 마무리

오늘 문제에서 가장 중요한 포인트는
리스트에서 특정 요소를 제거하는 방법입니다.

리스트 슬라이싱을 사용하지 않고
pop이나 del을 이용하여 제거하는 방법을 익혀두시길 바랍니다.

도움이 되셨다면 하단의 하트 한 번씩 부탁드립니다!
감사합니다.

 

반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,