본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 프린터

/  첫 번째 제출  /

 

from collections import deque
def solution(priorities, location):
    answer = 0
    l = len(priorities)
    for i in range(l):
        priorities[i] = [priorities[i], i]
    q = deque(priorities)
    renew = []
    while q:
        check = q.popleft()
        for i in range(len(q)):
            if check[0] < q[i][0]:
                q.append(check)
                break
        if l != len(q):
            renew.append(check)
            l = len(q)
    for i in range(len(renew)):
        if renew[i][1] == location:
            answer = i+1
            break
        
    return answer

 

 

채점 결과
정확성: 100.0
합계: 100.0 / 100.0
 
좀 효율적으로 동작하게 할 수는 없을까 고민하다가 풀이 시간이 길어졌습니다.
input 값이 100밖에 안 되는데 그냥 하자 해서 문제에서 제시한 구현사항 그~대로 구현했습니다.
더 나은 풀이가 분명 있을 것 같지만 떠올리기 가장 쉬운 방식이었습니다.
주어진 우선순위 리스트의 각 값의 인덱스를 미리 지정해주고, 각 값에 의거해 큐 자료구조를 사용해 하나씩 앞에서부터 빼서 남은 친구들과 비교하고, 우선순위가 가장 앞서는게 확실하면 새 리스트에 옮겨주고 그게 아니라면 다시 큐의 뒤부터 넣어주는 방식으로 구현했습니다. 
이 때, renew 에 넣어주는 지 체크하는 방식으로는 우선순위리스트의 길이에 변동이 있는지를 기준으로 검사했습니다.
만약 원래 리스트에 다시 넣어진 것이면 길이에는 변화가 없을 것이라는 생각 때문입니다. 
재배열이 끝난 뒤에 location에 맞는 값은 순차탐색으로 찾았습니다. 효율적이지는 못하지만 앞서 말했듯이 데이터값이 작아 일단 문제해결에 초점을 맞춰 그냥 작성했습니다.
.
이제 더 효율적인 방식을 생각해봅시다.
 

/  다른 분들 풀이  /

 

from collections import deque
def solution(priorities, location):
    index_list = deque([i for i in range(len(priorities))])
    maximum = max(priorities)
    answer = 0
    while True:
        index = index_list.popleft()
        if priorities[index] < maximum:
            index_list.append(index)
        else:
            answer += 1
            priorities[index] = 0
            maximum = max(priorities)
            if index == location:
                return answer

제가 구현하고자 했던 코드에서 더 발전된 형태인 것 같아 참고하기 위해서 가져왔습니다.

가장 큰 값부터 나오며 다른 값들은 뒤에 가야한다는 특징을 더 잘 살린 코드입니다. 

 

 

// 22.08.06 // 복습 1 //

 

from collections import deque

def solution(priorities, location):
    papers = deque([])
    papersNum = deque([])
    for i in range(len(priorities)):
        papers.append([priorities[i], i])
        papersNum.append(priorities[i])
    maxVal = max(papersNum) 
    
    cnt = 0
    while papers:
        curr_paper = papers.popleft()
        curr_paperVal = papersNum.popleft()
        if curr_paper[0] == maxVal:
            cnt += 1
            if papersNum:
                maxVal = max(papersNum)
            if curr_paper[1] == location:
                return cnt
        else:
            papers.append(curr_paper)
            papersNum.append(curr_paperVal)
        
    return answer

'CodingTest > Programmers' 카테고리의 다른 글

[ 프로그래머스 ] K번째 수  (0) 2022.06.21
[ 프로그래머스 ] 더 맵게  (0) 2022.06.20
[ 프로그래머스 ] 기능개발  (0) 2022.06.20
[ 프로그래머스 ] 위장  (0) 2022.06.18
[프로그래머스] 전화번호 목록  (0) 2022.06.18