algo lev-2 프린터 (python)

2 minute read

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

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

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다. 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

출처 : 프로그래머스 Level2

내가 푼 풀이

출력하기 원하는 문서priorities[location]가 출력될 때까지 prioities 리스트 완전탐색

  • 성공!

    def solution(priorities, location):
        printNum = 1
        i = 0
        while True :
            i %= len(priorities)
      
            if priorities[i] == max(priorities) :
                priorities[i] = False
      
                if i == location :
                    return printNum
                printNum += 1
            i += 1
    
    • max()의 시간복잡도가 O(n)인데 탐색때마다 반복되니 시간이 많이 걸렸다

다른 사람의 풀이

  • max()를 매번 사용하지 않고 중요도 순으로 내림차순 정렬한 search 리스트를 선언

    def solution(priorities, location):
        printnum = 0
        search, c = sorted(priorities, reverse=True), 0
        while True:
            for i, priority in enumerate(priorities):
                s = search[c]
                if priority == s:   	# 중요도가 같다면
                    c += 1				# 출력 (했다고 치고 다음 요소를 탐색)
                    printnum += 1
                    if i == location:
                        break
            else:
                continue
            break
        return printnum
    
    • sorted()의 시간 복잡도는 O(n logn)
    • for - else 구문
      • for 문이 다 끝났을 때 break를 만나지 않았다면 else 구문을 실행한다
      • else : continue 를 만나면 while 문의 처음부터 다시 실행 -> for 문 처음부터 실행 ( i=0 부터!)

배운 점

1) for - else

  • for 문안에 if와 break가 있을 때 주로 사용한다 (편리!)

  • for문 안에서 break를 만나지 않았고, for문이 종료되었을 경우 else 구문이 한 번 실행된다

  • 만약 break를 만났다면 else는 실행되지 않고 for 문은 종료

    for i in range(0,5):
        if i>10:
            print(i)
            break
    else :
        print ("else")
    
    • if 조건을 만족하지 않으므로 break를 만나지 않음
    • else 구문의 print(“else”) 가 실행됨
  • 예시 출처

    for n in range(2, 10):
        for x in range(2, n):
            if n % x == 0:
                print( n, 'equals', x, '*', n/x)
                break
        else:
            # loop fell through without finding a factor
            print(n, 'is a prime number')
    
    • 2 is a prime number

      3 is a prime number

      4 equals 2 * 2.0

      5 is a prime number

      6 equals 2 * 3.0

      7 is a prime number

      8 equals 2 * 4.0

      9 equals 3 * 3.0

Categories:

Updated:

Comments