[프로그래머스] 표 편집 (python)

JeeHyeok Lee·2023년 9월 6일
0

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/81303

문제 내용

0~n 명의 정보가 담긴 표를 명령어를 통해 조작하는 문제이다.

다음과 같은 표에 입력할 수 있는 명령어 U, D, C, Z가 있고 각 명령어는 다음과 같다.
"U X": 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.
"D X": 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.
"C" : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
"Z" : 가장 최근에 삭제된 행을 원래대로 복구합니다. 단, 현재 선택된 행은 바뀌지 않습니다.

문제 풀이

이차원 배열을 양방향 연결리스트의 형태와 유사하게 선언하여 사용하였다.
record 배열의 각 요소의 0번째 인덱스는 prev, 1번째 인덱스는 next를 의미한다.

def solution(n, k, cmd):
    global stack, deleteNum, cur, record
    stack = []
    record = []
    deleteNum = [1] * n
    cur = k
    
    # record 배열 선언
    for i in range(n):
        record.append([i-1, i+1])

	# 0번째 요소의 prev와 n번째 요소의 next를 -1로 선언
    record[0][0] = -1
    record[n-1][1] = -1

    for command in cmd:
        if len(command) == 1:
            if command == 'C':
                delete()
            else:
                resotre()
            
        else:
            c, num = command.split()
            move(c, int(num))
    
    answer = ''
    for i in deleteNum:
        if i == 1:
            answer += 'O'
        else:
            answer += 'X'
    
    return answer

# 현재 위치 이동 함수
def move(command, num):
    global cur, record
    cnt = 0
    
    if command == 'U':
    	# num 만큼 반복 
        for _ in range(num):
        	# 0번째 인덱스가 prev를 의미하므로 prev를 현재 위치로 변경
            cur = record[cur][0]
    
    if command == 'D':
        for _ in range(num):
        	# 0번째 인덱스가 next를 의미하므로 next를 현재 위치로 변경
            cur = record[cur][1]
            
# 삭제 함수
def delete():
    global deleteNum, cur, stack, record
    
    # 삭제 표시 및 복구를 위한 스택 배열에 요소 추가
    deleteNum[cur] = 0
    stack.append(cur)
    
    prev, next = record[cur]
        
    # 삭제할 요소의 next가 -1인 경우 마지막 요소이기 때문에 현재 위치를 prev로 설정
    if next == -1:
        cur = record[cur][0]
    
    else:
        cur = record[cur][1]
    
    # prev가 -1인 경우 삭제할 요소가 첫 번째 요소이기 때문에 next 요소가 첫 번째 요소가 된다.
    if prev == -1:
        record[next][0] = -1
    
    # next가 -1인 경우 삭제할 요소가 마지막 요소이기 때문에 prev요소가 마지막 요소가 된다.
    elif next == -1:
        record[prev][1] = -1
        
    else:
        record[prev][1] = next
        record[next][0] = prev
        
# 복구 함수
def resotre():
    global deleteNum, cur, stack, record
    
    # 복구할 요소 반환
    restore = stack.pop()
    prev, next = record[restore]
    
    deleteNum[restore] = 1
    
   	# prev가 -1인 경우 첫 번째 요소였기 때문에 next 요소만 변경
    if prev == -1:
        record[next][0] = restore
	# next가 -1인 경우 마지막 요소였기 때문에 prev 요소만 변경
    elif next == -1:
        record[prev][1] = restore

    else:
        record[next][0] = restore
        record[prev][1] = restore
         

0개의 댓글

관련 채용 정보