[프로그래머스] 표 편집

섬섬's 개발일지·2022년 3월 2일
0

프로그래머스

목록 보기
48/50

문제

정확성과 효율성 테스트 각각 점수가 있는 문제

  • 한 번에 한 행만 선택할 수 있으며, 표의 범위(0행 ~ 마지막 행)를 벗어날 수 없습니다.
  • 다음과 같은 명령어를 이용하여 표를 편집합니다.
    • "U X": 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.
    • "D X": 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.
    • "C": 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
    • "Z": 가장 최근에 삭제된 행을 원래대로 복구합니다. 단, 현재 선택된 행은 바뀌지 않습니다.

입력

  • 처음 표의 행 개수를 나타내는 정수 n (5<=n<=1,000,000)
  • 처음에 선택된 행의 위치를 나타내는 정수 k (0<=k<n)
  • 수행한 명령어들이 담긴 문자열 배열 cms

모든 명령어를 수행한 후 표의 상태와 처음 주어진 표의 상태를 비교하여 삭제되지 않은 행은 O, 삭제된 행은 X로 표시하여 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

코드

def solution(n, k, cmd):
    answer = ''
    maps = {} 
    for i in range(n):
        maps[i] = {'pre': i-1, 'post': i+1, 'deleted': False}
    q = list()
    
    for c in cmd:
        if c[0] == 'D': # 아래로 이동
            num = int(c[2:])
            while num > 0:
                k = maps[k]['post']
                num -= 1
        elif c[0] == 'U': # 위로 이동
            num = int(c[2:])
            while num > 0:
                k = maps[k]['pre']
                num -= 1
        elif c[0] == 'C': # 제거
            q.append(k)
            maps[k]['deleted'] = True
            if maps[k]['pre'] != -1:
                maps[maps[k]['pre']]['post'] = maps[k]['post']
            if maps[k]['post'] != n:
                maps[maps[k]['post']]['pre'] = maps[k]['pre']
                k = maps[k]['post']
            else:
                k = maps[k]['pre']
        else: # 다시 추가
            index = q.pop(-1)
            if maps[index]['pre'] != -1:
                maps[maps[index]['pre']]['post'] = index
            if maps[index]['post'] != n:
                maps[maps[index]['post']]['pre'] = index
            maps[index]['deleted'] = False
            
    return "".join(['X' if maps[x]['deleted'] else 'O' for x in maps])
profile
섬나라 개발자

0개의 댓글