프로그래머스

[프로그래머스]프린터

진철 2023. 1. 12. 22:46
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

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

programmers.co.kr

해당 문제를 간단하게 설명하면 다음과 같다.

priorities라는 배열이 주어지는데, 이는 프린트기의 우선순위를 나타낸다.

따라서 숫자가 크면 클수록 먼저 인쇄해야하는 프린트기인 것이다.

첫번째 배열에서부터 프린트기를 실행하는데, 우선순위가 낮으면 실행하지 않고 다음 프린트기로 넘어가는 것이다.

그리고 location이 주어지는데, 해당 위치의 프린트기가 몇 번째로 실행되는 지를 반환하는 것이 본 문제이다.

 

따라서 코드를 작성하기 위한 과정은 다음과 같다.

1. 큐를 사용하여 priorities를 대입하고 해당 원소가 location인지 판단하기 위해서 location의 위치만 1을 표현하고 나머지는 0을 나타내는 배열을 하나 선언한다.

2. 큐에서 하나씩 팝을 하면서 해당 값이 가장 큰 값보다 크면 팝을 유지하고 그렇지 않으면 append를 이용해서 다시 큐에 삽입해준다.

3. 원소가 팝이 되었다면 answer++를 해주고 만약 팝이 된 원소가 location에 해당된다면 반복문을 탈출해준다.

from collections import deque

def solution(priorities, location):
    answer = 0
    que=deque(priorities) #1번 : priorities를 큐로 만들어준다. 
    my=[0 for _ in range(len(priorities))] 
    my[location]=1 #1번 : 해당 원소가 location인지 확인하기 위해서 location만 1로 해주고 나머지는 0으로 선언해준다.
    my=deque(my) #1번 : 이 역시 팝을 사용할 것이기 때문에 큐로 만들어준다.
    cnt=0
    
    while(my):
        value=que.popleft() #프린트기의 우선순위를 나타냄
        check=my.popleft() #해당 프린트기가 location인지를 나타냄
        if len(que)>1 and max(que) > value: #2번 : 우선순위가 높지 않다면 팝한 원소를 다시 넣어준다.
            que.append(value)
            my.append(check)
        else : 
            answer+=1 #3번 : 우선순위가 높아서 팝이 되었다면 answer++를 해서 카운트해준다.
            if check==1: #3번 : 해당 원소가 location에 해당된다면 while문을 탈출한다.
                break
            
    return answer

해당 문제를 처음 풀었을 때는 런타임 에러가 꽤나 많이 발생한 것을 알 수가 있었다.

아래는 초기에 작성한 코드이다.

from collections import deque

def solution(priorities, location):
    answer = 0
    que=deque(priorities)
    my=[0 for _ in range(len(priorities))]
    my[location]=1
    my=deque(my)
    cnt=0
    
    while(my):
        value=que.popleft()
        check=my.popleft()
        if max(que) > value: #이 부분의 차이로 런타임 에러가 발생하였다.
            que.append(value)
            my.append(check)
        else :
            answer+=1
            if check==1:
                break
            
    return answer

max 함수는 값이 1개 이하로 있다면 굳이 max를 사용하지 않고 바로 값을 반환해도 된다.

따라서 값이 1개를 초과할 때, 사용해야 효율적으로 사용할 수 있다는 것이다. 

이러한 사소한 차이로 런타임 에러가 발생하는 점에서 참으로 디테일한 문제라고 생각했다.

이번 일을 계기로 함수에 대한 정의를 좀 더 꼼꼼히 공부해야할 필요가 있다고 생각이 든다.

728x90
반응형