프로그래밍/코드리뷰

[코드리뷰]프로그래머스_프린터

donie 2020. 10. 1. 14:57

1. 문제

programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린��

programmers.co.kr

2. 소스코드-1 ( Python3 )

def solution(priorities, location):

    queue =  [(i,p) for i,p in enumerate(priorities)]

    answer = 0

    while True:

        cur = queue.pop(0)

        if any(cur[1] < q[1] for q in queue):

            queue.append(cur)

        else:

            answer += 1

            if cur[0] == location:

                return answer

소스코드-2 ( Python3 )

def solution(priorities, location):

    answer = 0

    search, c = sorted(priorities, reverse=True), 0

    while True:

        for i, priority in enumerate(priorities):

            s = search[c]

            if priority == s:

                c += 1

                answer += 1

                if i == location:

                    break

        else:

            continue

        break

    return answer

 

3. 공부

1) pair : (a, b)

 

2) enumerate

출처 : GeeksforGeeks

예제 코드 결과 화면
list = ['a', 'b', 'c', 'd', 'e']

for element in enumerate(list):
    print(element)
print()

for index, element in enumerate(list):
    print (index, element)
print()

start = 10
for index, element in enumerate(list, start):
    print(index, element)

 

3) any함수 : iterable자료구조의 원소 중 하나의 원소라도 0이 아니면 true를 리턴하는 함수. 비어있거나 전부 0이어야 false를 리턴한다.

출처 : https://docs.python.org/3/library/functions.html#any

예제 코드 결과 화면

# ex1

list = ['a', 'b', 'c', 'd', 'e']

x = any(list)

print(x)

print()

 

# ex2

list = [0, 0, 0, 0, 0]

x = any(list)

print(x)

print()

 

# ex3 (프린터 문제 소스코드 이용)

priorities = [1, 1, 9, 1, 1, 1]

queue =  [(i,p) for i,p in enumerate(priorities)]

cur = queue.pop(0)

if any(cur[1] < q[1] for q in queue):

    print("현재 원소가 최고 우선순위가 아님")

else:

    print("현재 원소가 최고 우선순위가 맞음")

print()

 

4) 정렬하는 방법

(1) list.sort() 메소드

출처 : https://docs.python.org/3/library/stdtypes.html#list.sort

stable sort이다. 같은 key값을 가진 원소가 여러 개일 때, 그 원소들끼리의 순서가 유지되는 정렬이다.

in-place sort를 한다. 정렬된 리스트를 return하지 않고 원본 리스트를 수정한다. 따라서 추가공간이 필요하지 않기 때문에 크기가 큰 sequence를 정렬할 때 좋다.

만약 원본 리스트가 필요하지 않다면, 아래 sorted()함수보다 약간 더 효율적이다.

(2) sorted() 함수

출처 : https://docs.python.org/3/library/functions.html#sorted

원본 리스트가 필요한 경우에 사용하면 좋다. 정렬된 리스트를 리턴하기 때문.

 

4. 고찰

1) 소스코드-1 알고리즘 해석

queue에 index와 priority의 pair를 만들었다.
answer는 프린트한 문서 개수를 세는 변수.

while loop를 돌리면서
    현재 queue의 맨 앞의 원소를 pop한다.
    현재 원소의 priority보다 queue안의 다른 원소의 priority값이 높은 경우가 있는지 확인해서
        있으면 -> queue의 맨 뒤에 현재 원소를 다시 추가한다.
        없으면 -> 프린트한다. 현재 문서의 index가 location과 같은지 확인하여 같다면 answer를 리턴한다.

2) 소스코드-2 알고리즘 해석

마찬가지로 answer는 프린트한 문서 개수를 세는 변수.
priorities 리스트를 정렬하여 search에 저장하였고, c에 0을 저장한다. (c번째 프린트=c번째 높은 우선순위를 의미)

while loop를 돌리면서
    for loop를 돌리면서 i는 index, priority는 우선순위
        s는 c번째 프린트할 우선순위 값을 저장.
        현재 priority가 s와 같으면 (즉, 현재 문서의 우선순위 == 현재 프린트할 우선순위) -> 프린트한다. c와 answer 값을 +1하고 현재 문서의 index가 location과 같은지 확인하여 같다면 answer를 리턴한다.
        아니면 -> continue
        ## 내 생각) else: continue를 한 칸 앞으로 잘못 쓴 듯 하다. 원래는 if priority==s:에 대응하는 else인 것 같다. else문이 없어도 코드가 돌아가기 때문에 문제가 되지 않은 것 같다.