문제 설명
햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.
예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.
상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.
제한사항
- 1 ≤ ingredient의 길이 ≤ 1,000,000
- ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.
입출력 예
ingredientresult
| [2, 1, 1, 2, 3, 1, 2, 3, 1] | 2 |
| [1, 3, 2, 1, 2, 1, 3, 1, 2] | 0 |
내 코드
def check_complete(stack):
seq = [1,2,3,1]
if len(stack)>=4:
for j in range(-1, -5, -1):
if seq[j]!=stack[j]:
return 0
[stack.pop() for _ in range(4)]
return 1
return 0
def solution(ingredient):
answer = 0
stack=[]
for i in ingredient:
answer+=check_complete(stack)
stack.append(i)
answer+=check_complete(stack)
return answer
피드백
명백히 stack을 이용해 푸는 문제이다.
처음에 문제 이해를 잘못해 1n분 정도 날렸지만 다시 읽어보고 풀 수 있었다.
모든 요소를 스택에 append해주고 스택에서 연속으로 1, 2, 3, 1이 나왔을 때 answer+=1해주고 스택에서 지워준다. 이 과정을 반복하면 정답을 구할 수 있다.
또 다른 풀이
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
내 풀이에서는 IndexError가 날 것을 고려하여 stack의 크기가 4이상일 때 뒤에서 네 개 요소를 비교하는 방법을 이용했지만, 다른 풀이에서는 과감하게 슬라이싱해서 푼 것을 볼 수 있다.
어떻게 가능한 걸까?
인덱싱을 할 때에는 해당 요소가 없을 때 IndexError: list index out of range가 발생하지만 슬라이싱은 범위를 초과하거나 해당 요소가 존재하지 않을 때도 오류가 발생하지 않는다.
https://stackoverflow.com/questions/9490058/why-does-substring-slicing-with-index-out-of-range-work
Why does substring slicing with index out of range work?
Why doesn't 'example'[999:9999] result in error? Since 'example'[9] does, what is the motivation behind it? From this behavior I can assume that 'example'[3] is, essentially/internally, not the sa...
stackoverflow.com
인덱싱은 지정된 인덱스의 값을 return 받기 때문에 해당 인덱스의 값이 없으면 error가 나게 되지만,
인덱스 슬라이싱은 해당하는 sequence를 return 받기 때문에 해당 sequence가 없으면 빈 배열을 return받게 된다고 적혀있다.
라는 것이 이유이다.
참고할 수 있도록..^^
'Algorithm > 자료구조' 카테고리의 다른 글
| [Java] 백준 7662 - 이중 우선순위 큐 (0) | 2023.05.03 |
|---|---|
| [Java] 백준 1927 - 최소 힙 (0) | 2023.04.14 |
| 프로그래머스 Lv.1 - (2019 카카오 개발자 겨울 인턴십) 크레인 인형뽑기 게임 (Java) (0) | 2023.01.27 |
| 2022 카카오 신입 공채 1차 온라인 코딩테스트 for Tech developers - 문제 1 – 신고 결과 받기(프로그래머스 Lv.1) (0) | 2022.11.29 |
| 백준 10799-쇠막대기 (파이썬) (0) | 2022.10.06 |