코딩 테스트

[코딩테스트] 프로그래머스 : 프린터(python)

디벨로펄 2022. 11. 30.
반응형

문제 설명

프린터에서 지정한 작업이 몇번째로 출력되는지 알아내야한다.

리스트에서 가장 큰 숫자가 먼저 프린트 되고 하나씩 왼쪽으로 밀린다.

먼저, 현재 List에서 최대값을 알아내야한다. 이를 위해 max라는 함수를 구현.

list를 받아서 max값을 리턴한다. 시간복잡도는 O(n)

def max(lst):
    mx=0
    for i in lst:
        if(i>mx):
            mx=i
    return mx

1) pop하는 요소의 값이 max이면 출력한다.

2) 해당 값이 우리가 출력하고 싶은 값(location)이라면, 결과(answer)를 출력하고 종료한다.

3) pop한 값이 max가 아니라면 --> 오른쪽 끝에 더하여 준다.

def solution(priorities, location):
    answer=0
    val = priorities[location] #출력물의 우선순위.
    mx = max(priorities) #현재 시점의 최대값.
    while True:
        v = priorities.pop(0) # pop한 값.
        if v==mx: #pop한 값이 max라면 출력한다.
            answer+=1        # 출력했으므로 결과 값 +1
            if location==0: # 위치가 0이라면 우리가 출력하고 싶은 값이 출력된 것이다.
                break
            mx = max(priorities)
        else: #max값이 아니라면 오른쪽에 다시 넣어준다.
            priorities.append(v)
        
        ## 위치는 한칸씩 왼쪽으로 가며, -1이 될 경우 오른쪽 끝으로 보낸다.
        location-=1
        if location<0:
            location= len(priorities)-1
    
    return answer

 

다른 사람 풀이.

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

 

 

enumerate

 사용하면 몇 번째이고, 값이 무엇인지 한 번에 알 수 있다.

[(i,j) for i,j in enumerate(l)]
-->[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

any → 현재 pop한 값보다 큰 값이 있는지 없는지 확인(max의 역할)

- iterable을 인자로 받고, 전체 리스트에서 true가 하나라도 있으면 true,

전부 false인 경우에만 false이다.

ㅣ=[1,2,3,4,5]
any([i<100 for i in l])
Out[9]: True

any([i>4 for i in l])# any([F,F,F,F,T])
Out[10]: True

any([i>5 for i in l]) # any([F,F,F,F,F])
Out[11]: False

 

 

 

프로그래머스

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

programmers.co.kr

 

반응형

댓글