https://www.acmicpc.net/problem/12789
한 개의 리스트에 담겨있는 숫자를 순서대로 빼내야 하는 문제이다. 한 쪽으로밖에 뺄 수 없으므로, 다른 한개의 빈 리스트에 옮겨 담아가며 순서대로 빼야한다. 이러한 조건에서 주어진 순번대로 간식을 받을 수 있는지 없는지를 체크하는 문제이다.
최초의 리스트에서 숫자를 뺄 때는, 앞 쪽 인덱스부터 빼야하기 때문에, pop(0)를 사용했다. collections의 deque에서 제공하는 popleft()를 사용할 수도 있겠다.
옮겨 담기용 리스트는 최초의 리스트와는 다르게 가장 최근에 담긴 것부터 뺄 수 있기 때문에, pop()을 사용한다.
원소의 개수인 n을 입력받고, n개에 해당하는 원소들을 차례로 입력받는다.
n을 조건문에서 사용할 수도 있겠지만, 나는 결과적으로는 사용하지 않았다.
6번 줄부터 while문이 시작된다. 최초의 리스트에서 가장 먼저 빠져나갈 수 있는 0번 인덱스가 현재 간식을 받을 수 있는 순번을 나타내는 변수 i와 같다면, 간식을 받고 그 리스트를 빠져나간다. i는 다음 순번으로 넘어가기 위해 +1을 해준다.
그 순번이 아니라면, 새로운 리스트에 이동하여 대기하게 된다.
새로운 리스트에 담긴 숫자들이 순번에 맞으면 빼줘야 하는 작업이 필요하다. 하지만 연속된 순번들이 차례로 대기하고 있을 가능성이 있으므로, while문을 사용하여 위와 같은 순번 확인 작업을 시행한다. 여기서 temp가 애초에 비어 있을 경우에는 조건문이 정상적으로 실행되지 않으므로, temp==[]와 같은 조건을 추가해준다.
19~24번 줄은 while문의 종료 조건이다. 언젠가 최초의 리스트인 li는 빈 리스트가 되겠지만, 임시 리스트인 temp는 그렇지 않을 수도 있다.
temp가 비었다는 것은 모든 사람이 간식을 받았음을 의미하므로 Nice를 출력하고, 그렇지 않으면 모든 사람이 간식을 받는 것이 불가능하다는 의미이므로 Sad를 출력하면 된다.
코드가 깔끔하진 않은 것 같다. li==[]와 같은 조건을 not li와 같이 나타내면 코드가 더 깔끔해보이긴 하겠지만, 조금 더 직관적인 코드가 덜 헷갈리는 것 같다.
'Koala - 7기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/Python] 8979 올림픽 (0) | 2022.08.17 |
---|---|
[백준/python] 11655번 : ROT13 (1) | 2022.08.15 |
[백준/Python] 2566 최댓값 (2) | 2022.08.14 |
[백준/C++] 2902 KMP는 왜 KMP일까? (1) | 2022.08.14 |
[백준/python] 6996번 애너그램 (0) | 2022.08.14 |