기본기 다지기/코테 오답노트

[프로그래머스] 햄버거 만들기 (파이썬)

syveany 2025. 3. 3. 11:35

시간초과로 오류가 나서, 그리고 내 코드도 마음에 들지만 다른 사람 코드가 더 깔끔해보여서 기록해본다.

 

[문제]

애니팡 같은 문제였다. 특정 패턴이 반복되면 팡 터지고 지워져서 붙여지면 다시 팡 터지고를 반복하는 문제였다.

 

 

[코드]

while로 리스트 안에서 돌면서 1231이 지워지면 i를 앞으로 당겨서 풀었다.

처음에 1231이 지워진다음 i-=3로 설정하지 않고 i=0으로 설정했더니 시간초과가 떴다.

i=0 으로 설정하면 배열이 길어질 경우에 앞에서부터 무의미한 반복이 일어나서임을 깨닫고 i-=3로 바꿔줬다.

최대 3 인덱스 이하($\because$123일 경우)에는 다시 지워질 가능성이 없기 때문이다.

def solution(ingredient):
    answer = 0
    i = 0

    while i <= len(ingredient) - 4:
    	# 햄버거 배열에 1231이 나오면
        if ingredient[i:i+4] == [1,2,3,1]:
            # 1231 지우기
            del ingredient[i:i+4]
            # 지운 횟수 기록하기
            answer += 1
            # 3번째로 돌아가기 (여기서 i=0 대신 i-=3으로 설정했더니 시간복잡도 해결됨)
            i -= 3
        # 아니면 계속 진행
        else:
            i += 1
    # 마지막에 지운 횟수 출력
    return answer

 

 

[느낀점]

내 코드도 멋지다. 하지만 다른 사람 코드도 멋있었다!

아래와 같은 코드가 있었다.

def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for i in range(4):
                s.pop()
    return cnt

 

새로운 리스트 s를 만들어두고 하나씩 옮겨가면서 1231이 등장하면 pop을 해주는 방식이다.

다음에 다른 문제에서 쓸 일이 있으면 써봐야겠다.