일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- springboot
- 네트워크
- 리눅스
- 스프링부트
- C
- 스프링
- Kakao
- 쿠버네티스
- Linux
- 파이썬
- 운영체제
- Spring
- 개발자
- 캐시
- 프로그래머스 #카카오 #IT #코딩테스트
- 카카오
- Java
- 도커
- Elasticsearch
- 프로그래머스
- 코딩테스트
- DPDK
- Python
- IT
- 엘라스틱서치
- programmers
- 백엔드
- docker
- 알고리즘
- 자바
- Today
- Total
저고데
[프로그래머스]표 편집 본문
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드를 작성하기 위한 순서는 다음과 같다.
1. 표의 갯수가 백만 개 이하이므로 연결리스트를 구현한다.
2. cmd가 C일 때는 해당 표를 삭제해야하므로 해당 표가 맨 아래인지 구분한다. 맨 아래라면 커서를 위로 이동하고 그렇지 않다면 커서를 아래로 이동한 후에 head와 tail인지를 구분하고 연결리스트를 변경한다. 그리고 삭제한 표를 stack에 담아준다.
3. cmd가 Z일 때는 stack.pop()을 이용하여 최근에 삭제된 표를 알아낸다. C일 때와 마찬가지로, head인지 tail인지를 구분하고 연결리스트를 다시 이어준다.
4. cmd가 U와 D일 때는 연결리스트를 통해 지정된 횟수만큼 이동한다.
def solution(n, k, cmd):
answer = ['O']*n #answer의 초기값이다. 삭제를 한다면 해당 표는 'X'로 바꿔준다.
cur = k #현재 어떤 표인지를 나타내는 커서값이다.
table = {i:[i-1, i+1] for i in range(n)} #1번
table[0] = [None, 1] #Head
table[n-1] = [n-2, None] #Tail
stack = [] #삭제되는 표가 담기는 리스트이다.
for i in cmd:
if i == 'C': #2번
prev, next = table[cur]
stack.append([prev, cur, next]) #삭제한 표를 담아준다.
answer[cur] = 'X' #삭제하였으므로 answer 값을 변경한다.
if next == None: #해당 표가 가장 아래에 있어서 커서를 한 칸 올려줘야할 때이다.
cur = prev
else:
cur = next
if prev == None: #Head일 때
table[next][0] = None
elif next == None: #Tail일 때
table[prev][1] = None
else: #나머지의 경우
table[next][0] = prev
table[prev][1] = next
elif i == 'Z': #3번
prev, now, next = stack.pop()
answer[now] = 'O' #삭제한 것을 복귀하였으므로 answer 값을 변경한다.
if prev == None: #Head일 때
table[next][0] = now
elif next == None: #Tail일 때
table[prev][1] = now
else: #나머지의 경우
table[next][0] = now
table[prev][1] = now
else: #4번
i1, i2 = i.split(' ')
i2 = int(i2)
if i1 == 'D':
for _ in range(i2):
cur = table[cur][1]
else:
for _ in range(i2):
cur = table[cur][0]
### 4번 코드를 다음과 같이 작성하면 에러가 발생한다. 이유는 잘 모르겠다 ㅠㅠ
# else:
# if i[0] == 'D': 이건 왜 안되지 ??
# for _ in range(int(i[2])):
# cur = table[cur][1]
# else:
# for _ in range(int(i[2])):
# cur = table[cur][0]
###
return ''.join(answer)
파이썬으로 연결리스트를 구현하는 것은 처음이었기에 다른 블로그를 많이 참고하였다.
특이하게 딕셔너리를 사용하여 연결리스트를 구현한다는 것이 매우 매력적이었던 것 같다.
초기에 코드를 작성할 때는 시간복잡도를 고려하여 이중 for문을 사용하지 않고 아래와 같이 작성하였는데, sort()하는 부분이나 pop()을 할 때, 생각보다 많은 작업이 소요된 것 같다.
하지만 이번 문제를 통해 파이썬으로 연결리스트를 구현하는 개념을 완벽하게 터득한 것 같아서 매우 뿌듯하다.
#초기 작성 코드
def solution(n, k, cmd):
answer = ''
friends = [i for i in range(n)]
index = k
history = []
for i in range(len(cmd)):
if cmd[i][0] == 'D':
index += int(cmd[i][2])
elif cmd[i][0] == 'U':
index -= int(cmd[i][2])
elif cmd[i][0] == 'C':
history.append(friends.pop(index))
if index == len(friends)+1:
index -= 1
elif cmd[i][0] == 'Z':
friends.append(history.pop())
friends.sort()
check = {}
for i in range(n):
check[i] = 0
for i in friends:
check[i] += 1
for i in check.values():
if i == 1:
answer += 'O'
else:
answer += 'X'
return answer
'프로그래머스' 카테고리의 다른 글
[프로그래머스]자물쇠와 열쇠 (0) | 2023.02.15 |
---|---|
[프로그래머스]무인도 여행 (1) | 2023.02.15 |
[프로그래머스]마법의 엘리베이터 (0) | 2023.02.14 |
[프로그래머스]혼자 놀기의 달인 (0) | 2023.02.14 |
[프로그래머스]스티커 모으기(2) (0) | 2023.02.14 |