문제 링크


문제


  • [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]

  • 업무용 소프트웨어를 개발하는 니니즈웍스의 인턴인 앙몬드는 명령어 기반으로 표의 행을 선택, 삭제, 복구하는 프로그램을 작성하는 과제를 맡았습니다. 세부 요구 사항은 다음과 같습니다

  • 한 번에 한 행만 선택할 수 있으며, 표의 범위(0행 ~ 마지막 행)를 벗어날 수 없습니다. 이때, 다음과 같은 명령어를 이용하여 표를 편집합니다.

  • “U X”: 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.
  • “D X”: 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.
  • “C” : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
  • “Z” : 가장 최근에 삭제된 행을 원래대로 복구합니다. 단, 현재 선택된 행은 바뀌지 않습니다.

  • 처음 표의 행 개수를 나타내는 정수 n, 처음에 선택된 행의 위치를 나타내는 정수 k, 수행한 명령어들이 담긴 문자열 배열 cmd가 매개변수로 주어질 때, 모든 명령어를 수행한 후 표의 상태와 처음 주어진 표의 상태를 비교하여 삭제되지 않은 행은 O, 삭제된 행은 X로 표시하여 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

제한


  • 5 ≤ n ≤ 1,000,000
  • 0 ≤ k < n
  • 1 ≤ cmd의 원소 개수 ≤ 200,000
  • cmd의 각 원소는 “U X”, “D X”, “C”, “Z” 중 하나입니다.
  • X는 1 이상 300,000 이하인 자연수이며 0으로 시작하지 않습니다.
  • X가 나타내는 자연수에 ‘,’ 는 주어지지 않습니다. 예를 들어 123,456의 경우 123456으로 주어집니다.
  • cmd에 등장하는 모든 X들의 값을 합친 결과가 1,000,000 이하인 경우만 입력으로 주어집니다.
  • 표의 모든 행을 제거하여, 행이 하나도 남지 않는 경우는 입력으로 주어지지 않습니다.
  • 본문에서 각 행이 제거되고 복구되는 과정을 보다 자연스럽게 보이기 위해 “이름” 열을 사용하였으나, “이름”열의 내용이 실제 문제를 푸는 과정에 필요하지는 않습니다. “이름”열에는 서로 다른 이름들이 중복없이 채워져 있다고 가정하고 문제를 해결해 주세요.
  • 표의 범위를 벗어나는 이동은 입력으로 주어지지 않습니다.
  • 원래대로 복구할 행이 없을 때(즉, 삭제된 행이 없을 때) “Z”가 명령어로 주어지는 경우는 없습니다.
  • 정답은 표의 0행부터 n - 1행까지에 해당되는 O, X를 순서대로 이어붙인 문자열 형태로 return 해주세요.


👀 풀이


1차 시도

  • 파이썬의 리스트가 링크드 리스트와 같다고 오해하고 있었다. 그래서 배열의 중간 삽입/삭제 연산을 수행하는 데 시간이 오래 걸리지 않을 것이라 생각하고 실제 removeinsert가 이루어지도록 코드를 짰다.
  • 정확성 테스트는 통과했지만 효율성 테스트를 통과하지 못 했다.

2차 시도

  • 효율성 테스트에서 계속 시간초과가 나서 구글링 해 보니까 리스트를 사용해서 푸는 것이 아니었다… 내가 파이썬의 리스트를 오해하고 있었던 것이었다… 링크드 리스트를 만들어야 했다.
  • 그런데 해설 중에 dictionary로 링크드 리스트를 구현해 푼 분이 계셨다.
  • https://kjhoon0330.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%91%9C-%ED%8E%B8%EC%A7%91-Python
  • 이 풀이를 참고해서 삭제/삽입 연산을 수정하니까 효율성 테스트도 통과할 수 있었다.
  • 언어별 배열의 특정을 잘 파악하고 적절한 자료구조를 사용하고 구현할 수 있게 하자!

코드