[알고리즘] 스택(Stack) 프로그래머스 2단계 - 프린터

minidoo·2020년 9월 13일
1

알고리즘

목록 보기
12/85
post-thumbnail

1차 코드

def solution(priorities, location):
    
    prior = [ [i, priorities[i]] for i in range(len(priorities))]
    
    for _ in range(len(prior)):
        
        k = prior[1:]
        k.sort(key=lambda x:x[1], reverse=True)

        if(prior[0][1] < k[0][1]):
            d = prior[0]
            del prior[0]
            prior.append(d)
    
    answer = list(filter(lambda x:x[0]==location, prior))[0]
    
    return prior.index(answer) + 1

잘못 생각한 부분

예를 들어 [ 2, 3, 3, 1 ]이 주어졌다고 생각해보자.

첫 번째 인덱스 2보다 중요도가 높은 것이 있음으로 맨 뒤로 보낸다.
그 다음, [ 3, 3, 1, 2 ]에서 첫 번째 인덱스 3보다 중요도가 높은 것이 없으므로 두번 째 인덱스 3으로 초점을 이동시켜야 하는데 해당 과정을 실행하지 않고 멈춘 코드로 작성했다.

2차 코드

def solution(priorities, location):
    
    prior = priorities.copy()
    indexNum = [p for p in range(len(priorities))]
    
    i = 0
    while True:
        if prior[i] < max(prior[i+1:]):
            prior.append(prior.pop(i))
            indexNum.append(indexNum.pop(i))
        else:
            i = i + 1
        if i == len(prior) - 1:
            break

    return indexNum.index(location) + 1

while문을 멈춰야할 부분을 생각하지 못해서 i == len(prior) -1로 모든 반복문을 다 돌려줬다. 효율성이 낮다.

3차 코드

def solution(priorities, location):
    
    prior = priorities.copy()
    indexNum = [p for p in range(len(priorities))]
    
    i = 0
    while True:
        if prior[i] < max(prior[i+1:]):
            prior.append(prior.pop(i))
            indexNum.append(indexNum.pop(i))
        else:
            i = i + 1
        if prior === sorted(prior, reverse = True):
	    break

    return indexNum.index(location) + 1

결국 정답은 배열을 역순 정렬한 것과 같다. 이때 break를 걸어준다.

0개의 댓글