알고리즘 스터디

[프로그래머스] 스택/큐 4. 프린터

문제


풀이

처음에 보면서 역순으로 출력하고 같은 숫자가 있을 때에는 그중에 역순으로 출력된다고 생각했다.

def solution(priorities, location):
    value = priorities[location]
    count = priorities.count(value)
    orderInSameValue = 0
    
    for i in range(len(priorities)):
        if value == priorities[i]:
            orderInSameValue += 1
        if location == i:
            break
            
    priorities.sort(reverse = True)
    
    return priorities.index(value) + (count - orderInSameValue) + 1

 

후다닥 짜봤는데 6개의 케이스에서만 통과했다. 생각해보니 같은 중요도일 때 단순히 역순이 아니었다.

왜 난 꼭 이걸 해보고 나서야 아는건지.. 앞으론 시간 절약을 위해 풀기 전에 좀 더 잘 생각해 봐야겠다.

def solution(priorities, location):
    value = priorities[location]
    poped = 0

    while True:
        maxValue = max(priorities)
        if maxValue == value and value == priorities[0]:
            return location + 1

        while maxValue > priorities[0]:
            priorities.append(priorities.pop(0))
            if location - poped == 0:
                location += (len(priorities) - 1)
            else:
                location -= 1
  
        if maxValue == value:
            return location + 1
        else:
            priorities.pop(0)
            poped += 1            
    return 

예외 생각나는대로 풀이를 수정하다보니 더러워졌다. 대략 절반정도만 통과함

여기서 고치다가 더 헷갈릴 것 같아 지우고 다시 풀었다.

def solution(priorities, location):
    value = priorities[location]
    answer = 0

    while True:
        while max(priorities) > priorities[0]:
            priorities.append(priorities.pop(0))
            if location == 0:
                location = len(priorities) - 1
            else:
                location -= 1
        if max(priorities) == value and location == 0:
            return answer + 1
        
        priorities.pop(0)
        answer += 1
        location -= 1
        

통과했다.

이전에 location을 pop된 priorities의 기준으로 하지 않고

처음 길이 기준으로 했었더니 헷갈려서 과부하가 왔었다.

 

이번엔 정말 말 뜻대로 location으로 사용했더니 좀 덜 헷갈렸다.

다시 보니 if maxValue == value: 의 조건문에서 틀렸던 듯 하다.

maxValue가 value면서 location의 위치가 0이어야 했는데 location을 다르게 쓰다보니 생각 못했던 것 같다.

 

앞으로는 좀 더 직관적으로 변수를 활용해야겠다.

 

+ deque를 활용하면 pop(0) 시 더 빠륵게 처리할 수 있을 것이다.

 


다른 사람의 풀이

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

나도 저렇게 짝지어서 location을 저장시키고 싶었는데 문법 짬이 부족해서 직접 했다,,,

 

배울 점 

1. enumerate를 활용해 location과  priorities 짝으로 저장. 코드가 간단해짐

2. any: () 중 하나만 참이어도 True를 반환함