본문 바로가기

스터디 1일 1커밋

240217 [BOJ/백준] 10828. 스택

 

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net


나의 코드(성공)

N = int(input())
top = -1
stack = []
data = []
for n in range(N):
    data.append(input().split())

for command in data:
    if command[0] == 'push':
        num = command[1]
        top += 1
        stack.append(int(num))
    elif command[0] == 'pop':
        if len(stack) == 0:
            print(-1)
        else:
            y = stack.pop()
            top -= 1
            print(y)
    elif command[0] == 'size':
        print(len(stack))
    elif command[0] == 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    elif command[0] == 'top':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[top])

 

결과


시간초과 코드 - 함수사용

def f(x):
    if 'push' in x:
        global top
        num = command.split()[1]
        top += 1
        stack.append(int(num))
    elif x == 'pop':
        if len(stack) == 0:
            print(-1)
        else:
            y = stack.pop()
            top -= 1
            print(y)
    elif x == 'size':
        print(len(stack))
    elif x == 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    elif x == 'top':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[top])


N = int(input())
top = -1
stack = []
for n in range(N):
    command = input()
    f(command)

 

 

시간초과코드 - 입력데이터를 읽으며 동작

N = int(input())
top = -1
stack = []
for n in range(N):
    command = input()
    if 'push' in command:
        num = command.split()[1]
        top += 1
        stack.append(int(num))
    elif command == 'pop':
        if len(stack) == 0:
            print(-1)
        else:
            y = stack.pop()
            top -= 1
            print(y)
    elif command == 'size':
        print(len(stack))
    elif command == 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    elif command == 'top':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[top])


처음에 함수를 써서 했는데 시간초과가 났다. 그래서 함수를 쓰지 않고 데이터를 받자마자 명령어에 따라 동작하도록 코드를 짰다. 그것도 시간초과가 났다. 그래서 다른 친구들의 코드를 봤는데 readline으로 해결했다. 한 명이 빈 리스트에 일단 명령어들을 넣어놓고 그 리스트를 돌며 동작을 수행하도록 코드를 짰다. 그래서 나도 그렇게 해서 해결했다. 근데 왜....? 분명 데이터를 읽자마자 동작을 하게 알고리즘을 짜야 코드도 짧아지고 수행시간도 짧아진다고 들었던 것 같다. 그걸 떠올리고 코드짜면서 나름 뿌듯했는데 왜이래...?? 스택은 진짜 다 알고 이거 쉬운편이라고 생각했는데 정답률 낮은 이유가 시간초과때문이었나?? 동작시간을 줄일 수 있는 방법들 빨리 배우고싶다. 이 문제가 뭐라고 한시간이 넘게 걸리는지 모르겠다ㅜㅜㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ