티스토리 뷰
문제
문제 바로가기: [프로그래머스] 2021 카카오 채용연계형 인턴십 - 표 편집
풀이
#데이터의 범위가 1,000,000 * 200,000이기 때문에 단순히 풀면 안된다고 생각했다
#그래서 떠올린게 이전 값, 다음 값을 가리키도록 딕셔너리를 사용하여 연결리스트처럼 푸는 방법이였다
#딕셔너리, 연결리스트, 스택, 활용
1. 딕셔너리에 { 해당 숫자: [이전 숫자, 다음 숫자] } 를 가리키도록 모두 넣어줍니다 (예를들어 2일때, { 2: [1,3] } )
- 맨 처음 노드의 이전, 맨 마지막 노드의 다음은 가리키는 값이 없습니다
2. (이동) U 또는 D의 경우 select노드부터 가리키는 노드를 반복해서 타고 가면 됩니다
3. (삭제) C의 경우
3-1. 해당 노드가 가리키는 이전 노드에서 다음 노드를 가리키는 값을 원래 해당 노드가 가리키는 다음 노드 값으로 변경 합니다 (1 -> 2(X) -> 3) (1 -> 3)
3-2. 위의 과정을 똑같이 반대로 진행합니다 (1 <- 2(X) <- 3) ( 1 <- 3)
- 이 때, 처음 노드가 가리키는 이전값, 마지막 노드가 가리키는 다음값은 없기 때문에 유의합니다
3-3. 해당 노드를 삭제해줍니다
3-4. 스택에 삭제했던 노드의 정보를 넣어줍니다
3-5. select 선택된 노드는 다음 노드를 가리키게 해주고, 마지막 노드의 경우 문제에서 요구한 대로 이 때는 이전 노드를 가리켜야 합니다
4. (복구) Z의 경우
4-1. (가장 최근에 삭제했던) 스택의 마지막 원소를 이용해서 삽입해줍니다
- 이 때도, 처음 노드, 마지막 노드일 때를 유의합니다
4-2. 3번 과정과 비슷하게 해당 노드와 연결되어 있었던 노드들이 가리키는 값을 원래대로 변경해줍니다
5. 마지막에 딕셔너리에 있는 노드들이 존재한 것이기 때문에 차례대로 답을 도출해내면 됩니다
코드
def solution(n, k, cmd):
dictionary = {}
select = k
stack = []
for i in range(n):
if i == 0:
dictionary[i] = ['Null', i+1]
elif i == n-1:
dictionary[i] = [i-1, 'Null']
else:
dictionary[i] = [i-1,i+1] #이전 행, 다음 행
for i in cmd:
i = i.split(' ')
if i[0] == 'D':
for _ in range(int(i[1])):
select = dictionary[select][1]
elif i[0] == 'U':
for _ in range(int(i[1])):
select = dictionary[select][0]
elif i[0] == 'C':
if dictionary[select][1] == 'Null':
dictionary[dictionary[select][0]][1] = 'Null'
value = dictionary[select][0]
elif dictionary[select][0] == 'Null':
dictionary[dictionary[select][1]][0] = 'Null'
value = dictionary[select][1]
else:
dictionary[dictionary[select][0]][1] = dictionary[select][1]
dictionary[dictionary[select][1]][0] = dictionary[select][0]
value = dictionary[select][1]
stack.append([select,dictionary[select][0],dictionary[select][1]])
del dictionary[select]
select = value
elif i[0] == 'Z':
if stack[-1][1] != 'Null':
dictionary[stack[-1][1]][1] = stack[-1][0]
if stack[-1][2] != 'Null':
dictionary[stack[-1][2]][0] = stack[-1][0]
dictionary[stack[-1][0]] = [stack[-1][1], stack[-1][2]]
stack.pop()
answer = ""
for i in range(n):
if i in dictionary:
answer += 'O'
else:
answer += 'X'
return answer
결과
'알고리즘' 카테고리의 다른 글
[파이썬, 백준 20056] 마법사 상어와 파이어볼 (0) | 2022.07.11 |
---|---|
[파이썬, 프로그래머스] 순위 검색 - 2021 KAKAO BLIND RECRUITMENT (0) | 2022.06.26 |
[파이썬, 프로그래머스] 메뉴 리뉴얼 - 2021 KAKAO BLIND RECRUITMENT (0) | 2022.06.24 |
[파이썬] 2019 KAKAO BLIND RECRUITMENT - 후보키 (0) | 2022.06.22 |
[파이썬] 2020 카카오 인턴십 - 보석 쇼핑 (0) | 2022.06.15 |
- Total
- Today
- Yesterday