공간 관리자

시간 제한2초메모리 제한512 MB

요약
삽입, 삭제, 압축 연산을 best-fit 방식으로 처리하는 디스크를 시뮬레이션하고, 마지막 상태를 8개 구간의 여유 공간 비율로 출력하거나 디스크가 가득 찼다는 오류를 출력한다.
난이도

보통10점 중 6점

유형
시뮬레이션, 구현, 연결 리스트, 그리디
정답자
아직 제출이 없습니다

문제

대부분의 사람은 컴퓨터가 해야 할 일만 제대로 해낸다면 그 안에서 무슨 일이 일어나는지 크게 신경 쓰지 않는다. 하지만 컴퓨터 메모리 안에서 비트와 바이트가 움직이는 모습을 지켜보며 즐거워하는 소수의 괴짜도 있다.

주로 청소년인 이런 사용자를 위해 다국적 소프트웨어 회사 ACM(Abstractions of Concrete Machines)은 하드 디스크에서 수행된 연산을 추적하고 보고서를 만드는 시스템을 개발하려고 한다. 하드 디스크는 원자적인 저장 셀이 일렬로 늘어선 것이며, 각 셀의 크기는 1Kb이다.

구체적으로 ACM은 다음 세 종류의 연산을 추적하려고 한다.

  • insere NOME T
    크기가 T인 파일 NOME을 디스크에 넣는다. 이 이름의 파일은 아직 디스크에 없다고 가정해도 된다. 파일 크기 T는 XKb, XMb, XGb 중 한 형태로 주어지며 X는 정수이다(0<X≤10230 < X \le 1023). NOME은 길이가 최대 10인 문자열이다.
  • remove NOME
    파일 NOME을 디스크에서 지운다. 이 이름의 파일이 없으면 아무것도 하지 않는다.
  • otimiza
    디스크를 압축한다. 남아 있는 파일을 디스크의 시작 쪽으로 옮겨서 연속한 두 파일 사이의 빈 공간을 없애고, 디스크에 파일이 놓인 순서는 그대로 유지한다. 그 결과 디스크의 끝에 빈 공간이 하나로 모인다.

디스크 용량은 항상 8Kb의 배수이다. 처음에 디스크는 비어 있다. 즉 디스크 용량만 한 빈 블록 하나로 이루어져 있다. 파일은 항상 연속한 저장 셀로 된 블록 하나에 저장된다. 새로 넣는 파일은 크기가 파일 크기 이상인 빈 블록 가운데 가장 작은 블록의 시작 위치에 놓는다. 조건에 맞는 빈 블록이 여러 개이면 디스크의 시작에 가장 가까운 블록을 고른다. 충분히 큰 빈 블록이 없어서 파일을 넣을 수 없으면 otimiza 명령을 자동으로 실행한다. 최적화한 뒤에도 파일을 넣을 수 없으면 오류 메시지를 출력해야 한다. 모든 연산이 오류 없이 수행되면 프로그램은 아래에 설명한 방식으로 디스크의 최종 상태를 대략적으로 나타내야 한다.

1Mb는 1024Kb이고 1Gb는 1024Mb이다.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 디스크 연산의 개수를 나타내는 정수 N이 하나 주어진다(0<N≤100000 < N \le 10000). 둘째 줄에는 디스크 크기가 주어지며, 정수 D(0<D≤10230 < D \le 1023) 뒤에 단위 표시가 붙은 형태이다. 단위 표시는 Kb, Mb, Gb 중 하나인 두 글자 문자열이다. 이어지는 N개의 줄에는 디스크 연산(위에서 설명한 insere, remove, otimiza 중 하나)이 한 줄에 하나씩 주어진다. 입력의 끝은 N = 0으로 표시된다.

출력

각 테스트 케이스마다 한 줄을 출력한다. 모든 삽입 연산이 오류 없이 수행되었다면 디스크 상태의 대략적인 모습을 다음과 같이 한 줄로 출력한다. 디스크의 전체 바이트를 크기가 같은 연속한 블록 8개로 나눈다. 8개 블록 각각에서 비어 있는 바이트의 비율 P(퍼센트)를 구하고, 최종 상태를 다음 형식으로 출력한다.

[C][C][C][C][C][C][C][C]

여기서 C는 75<P≤10075 < P \le 100이면 공백 문자 ' ', 25<P≤7525 < P \le 75이면 '-', 0≤P≤250 \le P \le 25이면 '#'이다. 공간이 부족해서 파일을 넣을 수 없으면 ERRO: disco cheio라는 한 줄을 출력한다. 이 경우 그 테스트 케이스의 이후 연산은 무시한다.

예제1

  1. 예제 1

    입력
    3
    8Kb
    insere arq0001 7Kb
    insere arq0002 3Mb
    remove arq0001
    6
    8Mb
    insere arq0001 4Mb
    insere arq0002 1Mb
    insere arq0003 512Kb
    remove arq0001
    remove arq0001
    insere arq0001 5Mb
    0
    
    예상 출력
    ERRO: disco cheio
    [#][#][#][#][#][#][-][ ]