Problem Solving/Programmers
[Programmers] 2021 카카오 채용연계형 인턴십: 표 편집(Python)/Hashing
이진2
2021. 7. 18. 18:38
https://programmers.co.kr/learn/courses/30/lessons/81303
코딩테스트 연습 - 표 편집
8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"
programmers.co.kr
해싱을 이용한 문제가 종종 나오는 추세인듯 .... ㅠ
실제 코테에서는 뭔가 해싱을 써야되지 않을까?라는 생각만 하고 어려워보여서 다른 문제 풀었었는데 실제로 풀어보니 생각만큼 어렵진 않았다
연습할 때 정확성/효율성이 나뉘어져 있는 문제는 우선 러프하게 정확성만 통과하게 짜본 뒤 효율성 풀이로 고치는 편이다
그래서 이번 문제도 단순 구현으로 푼 뒤 해싱을 이용해서 다시 풀어봤다
- 테이블의 값이 활성화/삭제되었는지 체크할 status 배열을 만든다
- 특정 레코드가 삭제되면 status 배열에 False로 표시한 뒤 stack에 push한다
- 특정 레코드가 복구되면 stack에서 pop한 뒤 status 배열을 다시 True로 수정한다
이 부분은 동일하고, 이전/다음 레코드를 찾는 과정을 단순 구현 / 해싱으로 나눴다
단순 구현 풀이
- 현재 U/D에서 이동해야 할 회수대로 index를 이동한다
- 만약 이동 도중 비활성화된 레코드이면 카운트를 하지 않고 활성화된 레코드가 나올 때 까지 이동한다
해싱 풀이
- pre, post라는 이름의 dictionary를 만든다
- pre: 현재 index의 이전 index를 가리킨다
- post: 현재 index의 다음 index를 가리킨다
- 만약 특정 record가 삭제/복구되면 해당 index의 pre, post를 수정한다(연결리스트와 유사하게)
딕셔너리가 생각보다 메모리를 많이 차지하지 않아서 pre, post 두 개의 딕셔너리를 이용한 해시 풀이로 효율성을 통과햇당
def solution(n, k, cmd):
answer = ''
status=[True for _ in range(n)]
st=[]
dy=[-1,1]
pre=dict()
post=dict()
for i in range(n):
pre[i]=i-1
post[i]=i+1
pre[0]=n-1
post[n-1]=0
#삭제한 행을 순서대로 넣을 스택
p=k
last=n-1
for c in cmd:
op=c[0]
if op=='U':
cnt=int(c[2:])
for _ in range(cnt):
p=pre[p]
elif op=='D':
cnt=int(c[2:])
for _ in range(cnt):
p=post[p]
elif op=='C':
st.append(p)
status[p]=False
post[pre[p]]=post[p]
pre[post[p]]=pre[p]
if p==last:
p=pre[p]
last=p
else:
p=post[p]
else:
status[st[-1]]=True
post[pre[st[-1]]]=st[-1]
pre[post[st[-1]]]=st[-1]
if st[-1]>last: last=st[-1]
st.pop()
for i in status:
if i: answer+='O'
else: answer+='X'
return answer