프로그래머스 - 표 편집

hni1124·2022년 5월 2일
0

카카오 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
profile
42Seoul / 알고리즘 공부 중

0개의 댓글