카카오 lv3
연결리스트가 아니라서 잘못된게 아니고, 문자열을 split해서
썼어야하는데 order[2]로 그대로 쓰면 숫자 22처럼 2자리 이상은 받아올 수 가 없어서 틀림.
ㄴ>그럼에도 불구하고 리스트 구현이 맞다. 효율성이 너무 나오지 않기 때문
def solution(n, k, cmd):
answer = ''
check = [1]*n
index = k
Zst = []
for order in cmd:
if ((order[0] == 'D') or (order[0] == 'U')):
cnt = int(order[2])
if order[0] == 'D':
while(cnt):
index+=1
if check[index] == 1:
cnt-=1
if order[0] == 'U':
while(cnt):
index-=1
if check[index] == 1:
cnt-=1
if order[0] == 'C':
check[index] = 0
Zst.append(index)
cnt = 1
tempidx = index + 1
while(cnt and (tempidx < n)): #둘다인경우?
if check[tempidx] == 1:
cnt-=1
index = tempidx
tempidx+=1
if cnt:
tempidx = index - 1
while(cnt and tempidx >= 0):
if check[tempidx] == 1:
cnt-=1
index = tempidx
tempidx-=1
if order[0] == "Z":
addinx = Zst.pop()
check[addinx] = 1
tempans = []
for j in range(n):
if check[j]:
tempans.append("O")
else:
tempans.append("X")
answer = ''.join(tempans)
return answer
정답 코드
class Node:
def __init__(self, item):
self.data = item
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self):
self.nodeCount = 0
self.head = Node(None)
self.tail = Node(None)
self.head.prev = None
self.head.next = self.tail
self.tail.prev = self.head
self.tail.next = None
self.curr = None
self.Zst = []
def insertBefore(self, next, newNode):
prev=next.prev
newNode.next=next
newNode.prev=prev
prev.next=newNode
next.prev=newNode
self.nodeCount+=1
return True
def u(self, cnt):
for i in range(cnt):
self.curr = self.curr.prev
def d(self, cnt):
for i in range(cnt):
self.curr = self.curr.next
def c(self):
self.Zst.append((self.curr.prev, self.curr, self.curr.next))
self.curr.prev.next = self.curr.next
self.curr.next.prev = self.curr.prev
if self.curr.next==self.tail:
self.curr=self.curr.prev
else:
self.curr=self.curr.next
def z(self):
p,o,n = self.Zst.pop()
p.next = o
o.prev = p
n.prev = o
o.next = n
#curr = d(cnt,curr)
def solution(n, k ,cmd):
answer = ''
checkans = [0]*n
L=DoublyLinkedList()
## curr초기화 했다가 "C" 받으면 curr = c(curr)
for i in range(n):
tempnode = Node(i)
L.insertBefore(L.tail,tempnode)
if i == k:
L.curr = tempnode
for ord in cmd:
order = ord.split()
if order[0] == 'U':
L.u(int(order[1]))
if order[0] == 'D':
L.d(int(order[1]))
if order[0] == 'C':
L.c()
if order[0] == 'Z':
L.z()
t = L.head
while t.next.next:
t = t.next
checkans[t.data]=1
for cc in checkans:
if cc == 1:
answer+="O"
else:
answer+="X"
return answer
c에서 self.curr을 직접적으로 바꾸어 주는 방식으로 바꿨더니 통과함
의심가는 부분 오답 코드
int(order[2]) 스플릿 하기 전 >>> 맞음
c = ["D 22","U 3"]
for cc in c:
p = cc.split()
print(p)
for pp in c:
print(pp[2])
당연히 한 자릿수로 생각했는데 22같은 경우 2만 받아온다.
class Node:
def __init__(self, item):
self.data = item
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self):
self.nodeCount = 0
self.head = Node(None)
self.tail = Node(None)
self.head.prev = None
self.head.next = self.tail
self.tail.prev = self.head
self.tail.next = None
self.curr = None
self.Zst = []
def insertBefore(self, next, newNode):
prev=next.prev
newNode.next=next
newNode.prev=prev
prev.next=newNode
next.prev=newNode
self.nodeCount+=1
return True
def u(self, cnt):
for i in range(cnt):
self.curr = self.curr.prev
def d(self, cnt):
for i in range(cnt):
self.curr = self.curr.next
def c(self):
self.Zst.append((self.curr.prev, self.curr, self.curr.next))
if self.curr.next==self.tail:
postcurr=self.curr.prev
else:
postcurr=self.curr.next
self.curr.prev.next = self.curr.next
self.curr.next.prev = self.curr.prev
self.curr = postcurr
def z(self):
p,o,n = self.Zst.pop()
p.next = o
o.prev = p
n.prev = o
o.next = n
#curr = d(cnt,curr)
def solution(n, k ,cmd):
answer = ''
checkans = [0]*n
L=DoublyLinkedList()
## curr초기화 했다가 "C" 받으면 curr = c(curr)
for i in range(n):
tempnode = Node(i)
L.insertBefore(L.tail,tempnode)
if i == k:
L.curr = tempnode
for order in cmd:
if order[0] == 'U':
L.u(int(order[2]))
if order[0] == 'D':
L.d(int(order[2]))
if order[0] == 'C':
L.c()
if order[0] == 'Z':
L.z()
t = L.head
while t.next.next:
t = t.next
checkans[t.data]=1
for cc in checkans:
if cc == 1:
answer+="O"
else:
answer+="X"
return answer