데이터사이언스 기록기📚

[프로그래머스] Level 2_프린터(스택/큐) 본문

Coding Test/프로그래머스(Python)

[프로그래머스] Level 2_프린터(스택/큐)

syunze 2022. 9. 4. 02:54

문제 유형

스택/큐

 

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

주의해야할 점

  • 한 번 프린트 할 때마다, 남아있는 리스트 안의 최대값을 다시 찾아야 한다.
  • 한 번 프린트 할 때마다, 남아있는 리스트 안의 최대값 기준으로 다시 정렬해주어야 한다.
  • 남아있는 리스트의 크기가 갱신되는지 확인해봐야한다.

 

나의 문제 풀이

1차 시도(20.0)

from collections import deque

def solution(priorities, location):
    max_num = max(priorities)
    max_num_index = priorities.index(max_num)
    priorities = list(enumerate(priorities))
    
    for i in range(len(priorities)):
        if max_num == priorities[0][1] :
            break
        else:
            priorities.append(priorities.pop(0))
            
    for i in range(len(priorities)):
        if priorities[i][0] == location:
            return i+1

 

2차 시도(50.0)

# 한 번 프린트 될 때마다 위치 조정해야 함
def solution(priorities, location):
    answer = 0
    max_num = max(priorities)
    max_num_index = priorities.index(max_num)
    priorities = list(enumerate(priorities))
    
    # 하나 프린트 되면 다시 재정렬하기
    while True:
        for i in range(len(priorities)):
            if max_num == priorities[0][1] :
                break
            else:
                priorities.append(priorities.pop(0))

        if  priorities[0][0] == location:
            answer += 1
            return answer
        else:
            priorities.pop(0)
            answer += 1

 

3차 시도(통과)

  • enumerate 사용하여 인덱스도 같이 저장 -> location 찾기 편하게하기 위함
  • while문에서 max_num 재정의, 리스트 재정렬, location과 인덱스 동일한지 확인
def solution(priorities, location):
    answer = 0
    max_num = max(priorities)
    priorities = list(enumerate(priorities))
    
    # 하나 프린트 되면 다시 재정렬하기
    while True:
    	# max_num 재정의
        for i in range(len(priorities)):
            if i == 0:
                max_num = priorities[0][1]
            else:
                if max_num < priorities[i][1]:
                    max_num =  priorities[i][1]
       
       # 리스트 재정렬
        for _ in range(len(priorities)):
            if max_num == priorities[0][1] :
                break
            else:
                priorities.append(priorities.pop(0))
                
	# location이랑 인덱스 같은 경우, 값 하나 더한 후 리턴 
        # 아닌경우 값 하나 더하기
        if priorities[0][0] == location:
            answer += 1
            return answer
        else:
            priorities.pop(0)
            answer += 1

 

다른사람들의 풀이

1) any 이용

 

[python] 파이썬 all, any 함수 정리 및 예제

안녕하세요. BlockDMask 입니다. 예약해 둔 글이 다 떨어져서 다시 글을 써봅니다. 한동안 글을 쌓아놔서 개인 프로젝트를 많이 진행할 수 있었는데, 아쉽습니다. 오늘은 파이썬의 내장함수중에 all

blockdmask.tistory.com

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):		# 안에 있는 요소들(q[1])과 출력된 요소 비교
            queue.append(cur)
        else:
        	# 출력된 요소 하나 더하기
            answer += 1
            # 위치 확인
            if cur[0] == location:
                return answer

 

2) 

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

 

리뷰

 - 문제 제대로 이해하고 시작하기

 - 인덱스, 값 둘 다 필요하면 enumerate 사용

 

파이썬의 enumerate() 내장 함수로 for 루프 돌리기

Engineering Blog by Dale Seo

www.daleseo.com

 

Deque에 대한 추가 내용

 

[파이썬/Python] Collections - Deque

들어가며 코딩테스트에 응시할 때 빠르게 찾아볼 수 있도록 따로 정리한 내용입니다. 공부하시기에는 빈약한 내용일 수 있음을 미리 알려드립니다. 공식 문서를 참고할 때에는 대부분의 기업이

mong9data.tistory.com

 

728x90
Comments