TIL#120 프로그래머스 2단계 - 프린터

Dasom·2021년 1월 1일
0

python

목록 보기
45/50

면접준비를 하면서 틈틈히 알고리즘 문제를 풀어보고 있다:) 감을 잃지 않기 위해:) 같이 슬랙면접스터디(?)를 하고 있는 11기분과 프로그래머스를 같이 자주 푸는데 마치 같이 풀고 있는 것 같아서 더 재미있다!
오늘은 프로그래머스 2단계 프린터 문제를 풀어보았다.

만약에 priorities 로 [2, 1, 3, 2], location으로 2 가 들어왔다면 조건에 따라서 첫번째 인덱스인 2보다 중요도가 높은 문서인 3이 있기 때문에 대기목록의 마지막으로 간다. 그래서 [1, 3, 2, 2] 가 된다. 그 다음에는 1도 1보다 중요도가 높은 문서가 있기 때문에 [3, 2, 2, 1] 이 된다. 3보다 중요도가 높은 문서는 없기 때문에 3이 인쇄된다. 내가 인쇄를 요청한 문서가 location=2 이기 때문에 처음 priorities 리스트에서 인덱스 2번은 3이다. 내가 요청한 문서가 몇번째로 인쇄되는지 리턴하는 문제이기 때문에 인덱스2번이었던 3은 1번째로 인쇄되고 답은 1이 된다.

제일 고민했던 점은 숫자가 같은 경우였다...!
그래서 처음에 문제를 풀었을 때 굉장히 무식한 방법으로 비효율적으로 풀었다....
priorities 리스트를 하나 더 복사해서 두개의 리스트를 가지고 진행했다...ㅜㅜ

import copy


def solution(priorities, location):
    # deepcopy 메소드를 쓰면 원소를 바꿔도 바꾼 리스트에만 적용이 된다
    new_list = copy.deepcopy(priorities)
    new_list[location] = 'a'
    count = 0
    priorities_length = len(priorities)

    while priorities_length > 0:
        if priorities[0] < max(priorities):
            priorities.append(priorities[0])
            priorities.remove(priorities[0])
            new_list.append(new_list[0])
            new_list.remove(new_list[0])
        else:
            priorities.remove(priorities[0])
            if new_list[0] == 'a':
                return count + 1
            new_list.remove(new_list[0])
            count += 1
            priorities_length -= 1

같은 숫자가 있으면 구별할 수가 없기 때문에 새로운 리스트를 복사한 후 location 에 해당하는 원소를 'a'로 바꿔서 저장하고 진행했다.
다른 분들의 풀이를 봤는데 나는 정말 너무 무식하게 푼 거였다....
그래서 다른 분들의 풀이를 뜯어보고 공부를 하였다 :)

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를 사용해서 튜플형식으로 바꿔서 하면 되는 간단한 거였다...ㅜㅅㅜ

any 메소드에 대해서는 몰랐는데 진작에 알고 있었다면 여러가지에 잘 활용해 보았을 것 같다.

any(iterableValue)

any는 전달받은 자료형의 원소 중 하나라도 True 이면 True를 반환한다. 모두 다 False라면 False를 반환한다.

# any의 내부구현
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
profile
개발자꿈나무🌲

0개의 댓글