본문 바로가기

컴퓨터/코테

카카오 기출 - 표편집

실패

from functools import reduce

def moveCur(movement, arr, curIdx, m):
    while movement > 0:
        curIdx += m
        if arr[curIdx][1] == 'O':
            movement -= 1
    return curIdx

def findNextIdx(curIdx, arr):
    length = len(arr)
    ret = curIdx

    while curIdx < length - 1:
        curIdx += 1
        if arr[curIdx][1] == 'O':
            return curIdx

    while ret > 0:
        ret -= 1
        if arr[ret][1] == 'O':
            return ret

def solution(n, k, cmd):
    answer = ''
    curIdx = k
    arr = [[_, 'O'] for _ in range(n)]
    deleteStack = []
    for command in cmd:
        if command.startswith("D"):
            move = int(command.split()[1])
            curIdx = moveCur(move, arr, curIdx, 1)
        elif command.startswith("U"):
            move = int(command.split()[1])
            curIdx = moveCur(move, arr, curIdx, -1)
        elif command == "C":
            arr[curIdx][1] = 'X'
            deleteStack.append(curIdx)
            curIdx = findNextIdx(curIdx, arr)
        elif command == "Z":
            redo = deleteStack.pop()
            arr[redo][1] = 'O'

    answer = reduce(lambda acc, cur: acc + cur[1], arr, answer)
    return answer

아마 대부분이 이렇게 풀었을거라 생각된다. 하지만 움직일때마다 배열의 모든 칸을 일일이 돌아야하므로 정확성은 모두 통과하더라도 효율성에서는 박살나는 코드다. 그래서 이전 인덱스와 다음 인덱스를 가리키는 것을 추가해봤다. 

이전 인덱스와 다음 인덱스를 저장하는 이차원 배열이다.

실패

from functools import reduce

def solution(n, k, cmd):
    answer = ''
    curIdx = k
    arr = [[_, 'O', _-1, _+1] for _ in range(n)]

    deleteStack = []
    for command in cmd:
        if command.startswith("D"):
            for i in range(int(command.split()[1])):
                curIdx = arr[curIdx][3]
        elif command.startswith("U"):
            for i in range(int(command.split()[1])):
                curIdx = arr[curIdx][2]

        elif command == "C":
            arr[curIdx][1] = 'X'
            deleteStack.append(curIdx)
            prevIdx = arr[curIdx][2]
            nextIdx = arr[curIdx][3]
            if prevIdx != -1 :
                arr[prevIdx][3] = nextIdx
            if nextIdx != n:
                arr[nextIdx][2] = prevIdx
            curIdx = nextIdx if nextIdx != n else prevIdx
            
        elif command == "Z":
            redo = deleteStack.pop()
            arr[redo][1] = 'O'
            prevIdx = arr[redo][2]
            nextIdx = arr[redo][3]
            if prevIdx != -1 :
                arr[prevIdx][3] = redo
            if nextIdx != n:
                arr[nextIdx][2] = redo

    answer = reduce(lambda acc, cur: acc + cur[1], arr, answer)
    return answer

효율성 두개를 통과하게 됐지만 이 코드도 마찬가지로 시간초과였다.. 배열말고 딕셔너리를 사용했다.

 

성공

def solution(n, k, cmd):
    answer = ''
    curIdx = k
    arr = { i: ['O', i-1, i+1] for i in range(n)}

    deleteStack = []
    for command in cmd:
        if command.startswith("D"):
            for i in range(int(command[2:])):
                curIdx = arr[curIdx][2]
        elif command.startswith("U"):
            for i in range(int(command[2:])):
                curIdx = arr[curIdx][1]

        elif command == "C":
            arr[curIdx][0] = 'X'
            deleteStack.append(curIdx)
            prevIdx = arr[curIdx][1]
            nextIdx = arr[curIdx][2]
            if prevIdx != -1 :
                arr[prevIdx][2] = nextIdx
            if nextIdx != n:
                arr[nextIdx][1] = prevIdx
            curIdx = nextIdx if nextIdx != n else prevIdx

        elif command == "Z":
            redo = deleteStack.pop()
            arr[redo][0] = 'O'
            prevIdx = arr[redo][1]
            nextIdx = arr[redo][2]
            if prevIdx != -1 :
                arr[prevIdx][2] = redo
            if nextIdx != n:
                arr[nextIdx][1] = redo


    for i in range(n) :
        answer += arr[i][0]
    return answer

 

 

참고자료

https://all-knowledge-of-the-world.tistory.com/17

 

[Python] Dictionary를 이용해 데이터를 빠르게 검색하고 타이머로 시간을 측정해 보자!

안녕하세요. 오늘의 포스팅은 파이썬의 "dictionary(딕셔너리)" 에 대해 알아보려고 합니다. 오늘의 준비물은 IDEL 입니다. 파이썬을 처음 접하신 분이거나, IDEL 이 뭔지 모르겠다 하시는 분은 아래

all-knowledge-of-the-world.tistory.com

https://chancoding.tistory.com/43

 

[Python] 파이썬 자료형 및 연산자의 시간 복잡도(Big-O) 총 정리

시간 복잡도를 알아야 하는 이유 백준에서 알고리즘을 풀다 보니 '시간 초과'되는 경우를 자주 겪었습니다. 문제를 풀고 나서도 결과 시간이 다른 사람들보다 상당히 높게 나오는 경우가 있었는

chancoding.tistory.com

 

'컴퓨터 > 코테' 카테고리의 다른 글

백준 11657 타임머신  (0) 2021.08.30
카카오 기출 - 카드 뒤집기  (0) 2021.08.27
백준 2156 - 포도주 [dp]  (0) 2021.08.26
카카오 기출 - 키패드 누르기  (0) 2021.08.24
카카오 2021 기출 - 광고삽입  (0) 2021.08.23