몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 3] 표 편집 {언어 : Python} [꼭 다시 보기] 본문

알고리즘/꼭 다시 보기

프로그래머스 [Lv. 3] 표 편집 {언어 : Python} [꼭 다시 보기]

스위태니 2024. 11. 24. 13:07

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

정답 코드

def solution(n, k, cmd):
    sb = []
    deletes = []
    result = [1] * (n)
    up = [0] * (n)
    down = [0] * (n)
    for i in range(n):
        up[i] = i - 1
        down[i] = i + 1
    up[0] = -1
    down[n-1] = -1
    
    for c in cmd:
        if len(c) == 1:
            if c == "C":
                result[k] = 0
                deletes.append(k)
                # 표 수정
                # 아래 행의 윗 행이 k가 아니라 k의 윗행으로 수정
                if down[k] != -1:
                    up[down[k]] = up[k]
                
                # 윗 행의 아래 행이 k가 아니라 k의 아래 행으로 수정
                if up[k] != -1:
                    down[up[k]] = down[k]
                
                # k의 밑
                
                # 삭제 했을 때 아래 행이 -1인 경우
                if down[k] == -1:
                    # 현재 행의 위 행을 선택
                    k = up[k]
                else:
                    k = down[k]
            else:
                # Z
                select = deletes.pop()
                # 현재 선택된 행의 윗 부분의 아래를 select로 수정
                if up[select] != -1:
                    down[up[select]] = select
                
                # 현재 선택된 행의 아랫 부분의 위를 select로 수정
                if down[select] != -1:
                    up[down[select]] = select
                
                result[select] = 1
        else:
            alpha, num = c.split()
            num = int(num)
            if alpha == "D":
                for _ in range(num):
                    k = down[k]
            else:
                # U
                for _ in range(num):
                    k = up[k]
    for r in result:
        if r:
            sb.append("O")
        else:
            sb.append("X")
    answer = "".join(sb)
    return answer

풀이 방법

  1. 현재 위치를 삭제하고 되돌리는 것만 잘 하면 쉽게 풀 수 있다.
  2. 현재 위치의 위 아래행의 위치를 저장하는 up과 down배열을 만든다.
  3. 초기 값은 반복문을 통해서 초기화 시켜준다.
    1. 0번 인덱스의 위는 없으므로 -1
    2. n-1번 인덱스의 아래는 없으므로 -1
  4. 나머지는 주석과 같이 풀어주면 된다.

느낀점

  • 행을 삭제하고 다시 되돌리는 C와 Z를 수행할 때 인덱스 설정을 잘못해주는 오류를 범했다.
  • 다시 풀어보면서 풀이 방법을 떠올릴 수 있었지만 꼭 다시 보고 외우면 좋겠다.