[프로그래머스] 표편집 (Python)
by Frinee❓문제
https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❗풀이
🙈 본래 의도
- 현재 선택된 행의 이동, 삭제 그리고 삭제된 행 복구 명령어가 존재함.
- stack 과 크게 다르지 않다고 생각하였고 삭제된 경우 'X', 존재하는 경우 'O'로 표시
- 삭제할 경우, delete_list 에 삭제된 index를 저장하여 stack으로 활용
- 따라서 위/아래로 이동할 시에 O/X 여부를 판단하여 이동

하면 될 것으로 생각했으나...
→ o/x 여부를 확인하는 과정에서 시간초과 발생 및 정확성 문제 발생 😣
🙉 새로운 해답
그래서 다른 풀이들을 봐본 결과, 연결 리스트 (Linked List)에 대한 공부를 한 뒤,
다시 적용하기로 했다.
[자료구조/알고리즘] 연결 리스트 (Linked List)
연결 리스트 (Linked List)데이터를 감싼 노드를 포인터로 연결해서 공간적인 효율성을 극대화시킨 자료구조삽입 및 삭제는 O(1)이 소요되며 탐색에는 O(n)이 소요된다.배열과 달리 연결 리스트 원소
onyodev.tistory.com
이중 연결 리스트의 개념을 적용하여
현재 node를 key로 삼고
prev, next 노드의 쌍을 value로 갖는 dict를 생성하여 풀기로 하였다.
- 삭제 시, prev 노드의 next값과 next 노드의 prev값을 수정해주고
- 복구 시, prev 노드와 next 노드를 찾아 다시 값을 갱신해준다.
- 그리고 이동 시, 이동 횟수만큼 연결(prev or next)을 타고 간다.
💻 코드
''' 현재선택된 행 = now U X: 현재선택된 행 - X 행 D X: 현재선택된 행 + X 행 C : 현재선택된 행 삭제 -> 바로 아래 행 선택 (마지막 행 삭제의 경우, 바로 윗 행) Z : 가장 최근에 삭제된 행 복구 n: 행 개수 k: 처음 선택된 행의 위치 ''' def solution(n, k, cmd): now = k table = {i:[i-1, i+1] for i in range(n)} table[0] = [None, 1] table[n-1] = [n-2, None] del_list = [] check = ['O']*n for c in cmd: if c == 'C': check[now] = 'X' prev, next = table[now] del_list.append((prev,now,next)) now = table[now][0] if next == None else table[now][1] if prev == None: table[next][0] = None elif next == None: table[prev][1] = None else: table[next][0] = prev table[prev][1] = next elif c == 'Z': prev, that, next = del_list.pop() check[that] = 'O' if prev == None: table[next][0] = that elif next == None: table[prev][1] = that else: table[prev][1] = that table[next][0] = that else: c1, c2 = list(map(str, c.split())) if c1 == 'U': for _ in range(int(c2)): now = table[now][0] elif c1 == 'D': for _ in range(int(c2)): now = table[now][1] answer = ''.join(check) return answer
블로그의 정보
프리니의 코드저장소
Frinee활동하기
프리니의 코드저장소공부한 내용 정리하는 중 🤖