알고리즘 공부/코딩테스트(프로그래머스)

[프로그래머스 Level 2] 프린터 (Python 파이썬) 풀이 방법

yepppi 2023. 1. 4. 10:19
반응형
SMALL

오늘도 8시 출근 완료! 7시 2-30분쯤 집에서 나오면 아직 해가 뜨지 않아 보라색 하늘을 볼 수 있다. 너무 예뻐서 카메라에 담고 싶지만 안 담긴다는... 이른 아침에도 움직이는 사람들이 많다. 다들 열심히 산다는 걸 눈으로 보며 자극받는다.

 

 

프로그래머스 <프린터> 문제 보기

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스 <프린터> 문제 풀이

from collections import deque

def solution(priorities, location):
    
    check = 0
    p = deque(priorities)
    result = deque()
    
    while True:
        
        check = p[0]
        if max(p) > check:
            if location == 0:
                location += len(p) -1
            else:
                location -= 1
            p.append(p.popleft())
        else:
            if location == 0:
                break
            else:
                result.append(p.popleft())
                location -= 1
        
    return len(result)+1

deque를 사용해 문제를 풀었다. priorities의 맨앞 값보다 큰 값이 있는지 체크한 후 location 값을 조절해주었다. 경우의 수를 따져 원초적으로 해결한 방법이라 가독성은 좋을지 몰라도 좋은 코드는 아닌 거 같다. 처음에는 문제 이해를 잘못해서 이상하게 풀었는데, 문제를 다시 꼼꼼히 읽은 후에는 금방 풀어낼 수 있었다. 받은 점수를 봐도 그렇게 어려운 문제는 아니었다!

 

 

 

다른 풀이

def solution(priorities, location):
    answer = 0

    array1 = [c for c in range(len(priorities))] # index 위치 저장 
    array2 = priorities.copy() # 값 저장 (출력되는 값)

    i = 0
    while True:
        if array2[i] < max(array2[i+1:]):
            array1.append(array1.pop(i))
            array2.append(array2.pop(i))
        else:
            i += 1

        if array2 == sorted(array2, reverse=True):
            break

    return array1.index(location) + 1

deque를 사용하지 않고 list만으로 푼 풀이도 있었다. 처음 priorities의 인덱스를 저장한 array1과 priorities를 복사하여 정렬할 리스트를 담은 array2 두 개의 list를 사용하여 구현한 방법이다. 문서를 대기목록에서 꺼냈다가 다시 마지막에 넣을 때 array1의 인덱스와 array2의 값을 모두 이동시켜줌으로써 추후에 값이 모두 정렬되었을 때 location으로 순서를 출력할 수 있도록 한 로직이다.

 

 

def solution(priorities, location):
    priorities = [(v, idx) for idx, v in enumerate(priorities)]
    count = 0
    while True:
        if priorities[0][0] == max(priorities)[0]:
            count += 1
            if priorities[0][1] == location:
                break
            priorities.pop(0)
        else:
            priorities.append(priorities.pop(0))
    return count

enumerate를 사용하여 priorities를 리스트 인덱스를 모두 담은 객체로 바꾸어 계산해준 방법이다. 만약 맨 앞의 값이 priorities의 max값과 같다면 인쇄한 것으로 보고 count를 증가시켜주었으며 이때 location값이 일치한다면 while문을 빠져나와 이때의 count 값을 return 해주도록 한 로직이다.

 

 

 

어쩌다보니 프로그래머스 [코딩테스트 고득점 Kit]스택/큐 부분 6문제를 모두 다 풀어버렸다. 6개월 전에는 오늘 푼 '프린터'나 어제 푼 '다리를 지나는 트럭'을 도전해볼 용기조차 가지지 못했는데 그만큼 성장했다는 뜻이겠지? 6개월동안 따로 코딩테스트 준비를 했던 것은 아니니 이번 방학 2달 간 열심히 알고리즘 공부를 한다면 그래프 문제나 Level 3까지도 정복할 수 있지 않을까라는 자신감이 새어나온다. 하루를 기분 좋게 시작한 것 같다 :)

반응형
LIST