프린터

zzwwoonn·2022년 7월 3일
0

Algorithm

목록 보기
67/71

다 풀어놓고 한 줄 때문에 하루를 삽질했다. 로직은 분명히 맞다고 생각했고 도저히 예외가 떠오르질 않았다. 질문 목록에서 가르쳐 주는 모든 예외를 다 넣어봐도 맞게 나왔었다.

다 풀었다고 생각했는데 시간초과도 아니고 예외도 도저히 없는데 자꾸 틀렸다 하니까 답지를 보기도 좀.. 짜증이 나더라

정현이 형이 한방에 해결해줬다. 현재 비교하는 인덱스 위치를 기억하기 위해 최대값을 뽑아냈을 때 해당 값을 pop하고 젤 뒤에 0을 push 해준다.

최대값일 때는

priorities.pop(0)
priorities.append(0)

이렇게 잘 해놓고

다시 돌아서 0을 만났을 때는 그냥 pop만 했었다.

정답 코드

def solution(priorities, location):
    answer = 0
    lenP = len(priorities)
    answerNum = priorities[location]
    cnt = 0
    answer = 0

    while priorities:
        # input()

        # print("cnt = ", cnt)
        if cnt == lenP:
            cnt = 0
            # print("change cnt = 0 ")

        X = priorities[0]
        # print("X = ", X)

        if X == 0:
            priorities.pop(0)
            priorities.append(0)

            cnt += 1
            continue

        if max(priorities) == X: 
            # print("this is max")
            answer += 1
            # print("answer = ", answer)
            priorities.pop(0)
            priorities.append(0)
            # print("priorities = ", priorities)
            
            if cnt == location and X == answerNum:
                # print("Find Answer ")
                return answer

        else:
            priorities.append(priorities.pop(0))
        
        # print("after = ", priorities)
        cnt += 1

# 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
# 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
# 3. 그렇지 않으면 J를 인쇄합니다.
# 1개 이상 100개 이하의 문서가 있습니다.
# priorities = [2, 1, 3, 2]
# location = 2

# priorities = [1, 1, 9, 1, 1, 1]
# location = 0
# 1
priorities = [1,2,3,2,1]
location = 0

# 5

print(solution(priorities, location))

정답 코드(주석 제거)

def solution(priorities, location):
    answer = 0
    lenP = len(priorities)
    answerNum = priorities[location]
    cnt = 0
    answer = 0

    while priorities:
        if cnt == lenP:
            cnt = 0

        X = priorities[0]

        if X == 0:
            priorities.pop(0)
            priorities.append(0)
            cnt += 1
            continue

        if max(priorities) == X: 
            answer += 1
            priorities.pop(0)
            priorities.append(0)
            
            if cnt == location and X == answerNum:
                return answer

        else:
            priorities.append(priorities.pop(0))
        
        cnt += 1

print(solution(priorities, location))

다른 풀이

deque를 쓰면 절반정도 빠르다고 한다. (시간 초과가 나왔으면 이거라도 해봤을텐데 답이 틀렸다고 나오니...)

def solution(priorities, location):
  answer = 0
  from collections import deque

  d = deque([(v,i) for i,v in enumerate(priorities)])

  while len(d):
      item = d.popleft()
      if d and max(d)[0] > item[0]:
          d.append(item)
      else:
          answer += 1
          if item[1] == location:
              break
  return answer

0개의 댓글