시간초과로 오류가 나서, 그리고 내 코드도 마음에 들지만 다른 사람 코드가 더 깔끔해보여서 기록해본다.
[문제]
애니팡 같은 문제였다. 특정 패턴이 반복되면 팡 터지고 지워져서 붙여지면 다시 팡 터지고를 반복하는 문제였다.
[코드]
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을 해주는 방식이다.
다음에 다른 문제에서 쓸 일이 있으면 써봐야겠다.
'기본기 다지기 > 코테 오답노트' 카테고리의 다른 글
[프로그래머스] 달리기 경주 (파이썬, 시간복잡도 개선) (0) | 2025.03.06 |
---|---|
[프로그래머스] 옹알이(2) (파이썬) (0) | 2025.03.04 |
[프로그래머스] 대충 만든 자판 (파이썬) (0) | 2025.02.27 |
[프로그래머스] 숫자 짝꿍 (파이썬) (0) | 2025.02.26 |
[프로그래머스] 평행 (파이썬) (0) | 2025.02.24 |