_Han_
나의 개발 노트
_Han_
  • 분류 전체보기 (272)
    • 데이터 엔지니어링 (29)
    • 인프라 (3)
    • 추천시스템 (11)
    • 코딩테스트 (146)
    • 부트캠프 회고 (15)
    • 회고 (4)
    • 자격증 (1)
    • 파이썬 프로그래밍 (6)
    • 통계 (2)
    • Git (21)
    • 유니티2D (33)

최근 글

반응형
hELLO · Designed By 정상우.
_Han_

나의 개발 노트

[코딩테스트] 프로그래머스 프린터 파이썬(Python)
코딩테스트

[코딩테스트] 프로그래머스 프린터 파이썬(Python)

2023. 1. 19. 15:19
반응형

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

 

프로그래머스

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

programmers.co.kr

from collections import deque
def solution(priorities, location):
    temp = [(p, i) for i, p in enumerate(priorities)]
    temp = my_sort(temp)
    for i in range(len(temp)):
        if location == temp[i][1]:
            return i+1

def my_sort(temp):
    q =deque(temp)
    result = []
    while q:
        j, index = q.popleft()
        for i in range(0, len(q)):
            if q[i][0] > j:
                q.append((j, index))
                break
        else:
            result.append((j, index))
    return result

먼저 저는 list comprehension을 사용하여 temp에 (우선순위, 인덱스)형태로 값을 저장하였습니다.

 

my_sort함수를 작성하여 문제에서 요구한 인쇄순서로 정렬하였습니다.

my_sort함수에서는 리스트의 맨 앞을 쉽게 추출하기 위하여 collections의 deque를 사용하였습니다.
while문을 통하여 q가 빌때까지 반복하는데 j, index로 q의 가장 첫번째 요소를 추출하고
나머지 q에 j보다 큰 값이 있는지, 즉 중요도가 높은 값(문서)이 있는지 확인합니다.


만약 중요도가 높은 값(문서)이 존재한다면 현재 문서 j와 index 를 q.append()를 하여 q의 가장 마지막 부분으로 옮겨 저장합니다.
그리고 break문으로 for문을 빠져나옵니다.


break에 걸리지 않고 for문을 다 돌았다면 else문에서 result에 j와 index를 저장합니다.

이렇게 정렬된 temp를 반복하면서 location과 temp[i][1]이 동일하다면 i+1을 하여 결과를 반환합니다.

 

다음은 위의 코드를 약간 수정하여 문제를 해결한 코드입니다.

다른 사람의 풀이에서 좋은 코드가 있어서 참고하였습니다.

from collections import deque
def solution(priorities, location):
    temp = [(p, i) for i, p in enumerate(priorities)]
    temp = my_sort(temp)
    for i in range(len(temp)):
        if location == temp[i][1]:
            return i+1

def my_sort(temp):
    q =deque(temp)
    result = []
    while q:
        j, index = q.popleft()
        if any(j < value[0] for value in q):
            q.append((j, index))
        else:
            result.append((j, index))
    return result

위의 코드와 많이 유사하지만 중요도가 높은 문서를 찾는 과정에서 any와 for 키워드를 사용하여 2줄로 줄여 문제를 해결한 것을 확인할 수 있습니다.
시간복잡도는 $O(n^{2})$으로 비슷한것 같지만 가독성은 더 좋아진 것 같습니다!

반응형

'코딩테스트' 카테고리의 다른 글

[코딩테스트] 프로그래머스 자동차 대여 기록에서 장기/단기 대여 구분하기 MySQL  (1) 2023.01.21
[코딩테스트] 프로그래머스 평균 일일 대여 요금 구하기 MySQL  (0) 2023.01.20
[코딩테스트] 프로그래머스 괄호 회전하기 파이썬(Python)  (1) 2023.01.18
[코딩테스트] 백준 수 찾기 파이썬(Python)  (0) 2023.01.17
[코딩테스트] 백준 부분수열의 합 파이썬(Python)  (0) 2023.01.14
    '코딩테스트' 카테고리의 다른 글
    • [코딩테스트] 프로그래머스 자동차 대여 기록에서 장기/단기 대여 구분하기 MySQL
    • [코딩테스트] 프로그래머스 평균 일일 대여 요금 구하기 MySQL
    • [코딩테스트] 프로그래머스 괄호 회전하기 파이썬(Python)
    • [코딩테스트] 백준 수 찾기 파이썬(Python)
    _Han_
    _Han_
    학습한 것을 기록합니다.

    티스토리툴바