프로그래머스|표 편집

README·2023년 1월 14일
0

파이썬 PS풀이

목록 보기
112/136

문제 설명

표와 표를 제어하는 명령어들을 입력받고 명령어들을 모두 실행한 뒤의 표와 초기 표를 비교하여 어떤 행이 남아있는지 구하는 문제입니다. 명령어의 종류는 위로 X칸 이동(U X), 아래로 X칸 이동(D X), 행 삭제(C), 가장 최근에 삭제한 행 복구(Z)가 있고 명령어들을 모두 실행한 뒤에 남아있는 행은 O로 표시하고 삭제된 행은 X로 표시합니다.

작동 순서

  1. 현재 선택된 행보다 위에 있는 행들을 저장하는 힙과 현재 선택된 행과 아래쪽 행들을 저장하는 힙, 그리고 삭제된 행들을 저장하는 큐를 생성합니다.
  2. 행을 위로 X칸 이동하는 명령어가 입력되면 UP에서 행들을 가져와서 그 행을 선택하는 행위를 X번 반복합니다.
  3. 행을 아래로 X칸 이동하는 명령어가 입력되면 현재 행을 UP으로 보내고 새로운 행을 선택하는 행위를 X번 반복합니다.
  4. 행을 삭제하는 명령어가 입력되면 현재 행을 삭제하고 temp 큐에 저장합니다.
  5. 행을 복구하는 명령어가 입력되면 가장 최근에 삭제된 행의 번호를 확인하고 현재 행보다 숫자가 작은 경우 UP으로 보내고 현재 행보다 숫자가 크면 DOWN으로 보냅니다.
  6. 모든 명령어 수행이 끝나면 힙에 저장되있는 값들을 모두 꺼내고 남아있는 행들을 확인하고 O,X로 표기합니다.

소스코드

from collections import deque
import heapq


def solution(n, k, cmd):
    answer = ''

    up = []
    down = []
    temp = deque()
    for i in range(n):
        heapq.heappush(down, i)

    for i in range(k):
        now = heapq.heappop(down)
        heapq.heappush(up, -now)

    for c in cmd:
        if c == "C":
            temp.append(heapq.heappop(down))
            if not down:
                heapq.heappush(down, -heapq.heappop(up))
        elif c == "Z":
            if temp[-1] < down[0]:
                heapq.heappush(up, -temp.pop())
            else:
                heapq.heappush(down, temp.pop())
        else:
            c1, c2 = c.split(" ")
            if c1 == "D":
                for i in range(int(c2)):
                    heapq.heappush(up, -heapq.heappop(down))
            else:
                for i in range(int(c2)):
                    heapq.heappush(down, -heapq.heappop(up))
    total = [0] * n
    while up:
        total[-heapq.heappop(up)] = 1
    while down:
        total[heapq.heappop(down)] = 1

    for i in total:
        if i == 1:
            answer += "O"
        else:
            answer += "X"
    return answer
profile
INTP 개발자 지망생

0개의 댓글