고장난 프린터
현수가 다니는 회사의 프린터가 고장이 나서 프린트를 요청한 순서대로 프린트를 하는게 아니 라 약간 이상은 규칙에 의해서 프린트를 합니다.
이상한 규칙은 다음과요청한 순서에서 먼저 이 규칙을 반복하면서 만약 프린트를 요청한 [3, 1, 4, 5, 2, 6, 7]
3번, 1번 작업을 프린트 하고, 4번 작업은 맨뒤로 보냅니다. [5, 2, 6, 7, 4] 같습니다.
2개의 작업을 프린트하고, 3번째 작업은 순서상 맨 뒤로 보내버립니다. 프린트를 합니다.
작업번호 순서가 아래와 같다면 5번, 2번 작업을 프린트 하고, 6번 작업을 맨뒤로 보냅니다. [7, 4, 6]
7번, 4번 작업을 프린트 하고 6번 작업을 맨뒤로 보냅니다. [6] 마지막으로 6번 작업을 프린트합니다.
매개변수 nums에 프린트를 요청한 작업번호 순서가 주어지면 맨 마지막에 출력되는 작업의 번호를 반환하는 프로그램을 작성하세요.
제한사항:
• nums의 길이는 1,000을 넘지 않습니다.
• 1 <= nums[i] <= 1,000
나의 코드
from collections import deque
def solution(nums):
answer = 0
dq=deque(nums)
while True:
if len(dq)==1:
return dq.popleft()
else:
dq.popleft()
if len(dq)==1:
return dq.popleft()
else:
dq.popleft()
dq.append(dq.popleft())
print(solution([3, 1, 4, 5, 2, 6, 7]))
print(solution([10, 8, 3, 1, 4, 5, 2, 6, 7, 9]))
print(solution([10, 8, 3, 11, 12, 1, 4, 5, 2, 6, 7, 9]))
print(solution([10, 8, 3, 1, 4, 5, 2, 11, 13, 6, 7, 12, 9, 14]))
print(solution([1, 8, 6, 10, 4, 7, 2, 5, 3, 9]))
한 사이클이 popleft popleft append(popleft)로 생각하여 큐에 두개만 남았을 경우 popLeft를 두번 연속으로 무지성으로 하다가 에러가 났었다.
그래서 큐에 하나만 남지 않았을 경우에도 큐의 개수에 맡게 로직을 변경 하였다.
정답 코드
from collections import deque
def solution(nums):
queue = deque(nums)
while queue:
for _ in range(2):
if len(queue) > 1:
queue.popleft()
queue.append(queue.popleft())
if len(queue) == 1:
return queue[0]
print(solution([3, 1, 4, 5, 2, 6, 7]))
print(solution([10, 8, 3, 1, 4, 5, 2, 6, 7, 9]))
print(solution([10, 8, 3, 11, 12, 1, 4, 5, 2, 6, 7, 9]))
print(solution([10, 8, 3, 1, 4, 5, 2, 11, 13, 6, 7, 12, 9, 14]))
print(solution([1, 8, 6, 10, 4, 7, 2, 5, 3, 9]))
전체적으로 나와 비슷한 로직이지만 그래도 for문을 2 회만 명령에 맞게 깔끔하게 돌려 가독성으로나 이해도 측면으로나 더 좋은 코드 같다
난 역시 너무 분기처리 충인것 같다.. if 을 써도 무지성 elif가 아닌 이쁘게 가독성 및 디버깅에 좋게 작성하려 노력해야겠다.
'코딩테스트[파이썬] > 입문자를 위한 코딩테스트 핵심' 카테고리의 다른 글
[DFS] -픽셀수 구하기 (0) | 2024.01.23 |
---|---|
[DFS] -검정색 구하기 (0) | 2024.01.23 |
[스택과 큐] -샌드위치 (0) | 2024.01.23 |
[스택 과 큐] -연속된 문자 지우기 (0) | 2024.01.23 |
[스택과 큐] -Backspace (0) | 2024.01.23 |