πŸ“ Algorithms

λ°±μ€€ 10828 : μŠ€νƒ (+νŒŒμ΄μ¬μ—μ„œ switch-case κ΅¬ν˜„)

μš”λ‹ˆκΉ€ 2023. 2. 20. 15:09

더 λ§Žμ€ 풀이

 

Algorithms & Data structures

πŸ“ μŠ€ν„°λ”” 정보

graceful-canary-e9f.notion.site

 

 

πŸ“ λ¬Έμ œ μš”μ•½


μž…λ ₯ μ»€λ§¨λ“œμ— 따라 μŠ€νƒμ— push, pop 등을 κ΅¬ν˜„ν•˜λŠ” 문제

  • μž…λ ₯

첫째 쀄 : μ»€λ§¨λ“œ μ‹€ν–‰ 횟수 (1 ≀ N ≀ 10,000)

n번: μ»€λ§¨λ“œ

  • 좜λ ₯

빈 μŠ€νƒμ— λŒ€ν•˜μ—¬ μ»€λ§¨λ“œκ°€ λͺ¨λ‘ μ‹€ν–‰λœ ν›„μ˜ μŠ€νƒ

  • μ˜ˆμ‹œ

size - μŠ€νƒ 길이 좜λ ₯ empty - λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€ 체크 (yes-1, no-0)

pop - μŠ€νƒ μ΅œμƒλ‹¨ 제거 top - μŠ€νƒ μ΅œμƒλ‹¨ 좜λ ₯ push 123 - μŠ€νƒμ— 숫자 123 μŒ“κΈ°

 

πŸ“ λ¬Έμ œ 풀이


  1. μ‚¬μš©ν•œ 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜
    • μŠ€νƒ
  2. μ†ŒμŠ€ μ½”λ“œ 및 문제 풀이

방법 1은 λ‹¨μˆœ if-else문을 ν™œμš©, 방법 2λŠ” switch-case문을 파이썬 λ”•μ…”λ„ˆλ¦¬λ‘œ μœ μ‚¬ν•˜κ²Œ κ΅¬ν˜„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

  • 4λ°° λΉ λ₯Έ 검색 μ‹œκ°„

μ†Œλͺ¨λœ μ‹œκ°„μ„ 보면 속도가 4λ°° 이상 차이가 λ‚œλ‹€λŠ” κ±Έ μ•Œ 수 μžˆλŠ”λ°μš”, κ·Έ μ΄μœ λŠ” if-else문은 μ›ν•˜λŠ” 쑰건이 λ‚˜μ˜¬ λ•ŒκΉŒμ§€ 순차적으둜 β€œλͺ¨λ“ β€ 경우λ₯Ό λΉ„κ΅ν•˜μ§€λ§Œ, λ”•μ…”λ„ˆλ¦¬λ‘œ κ΅¬ν˜„λœ switch-case ꡬ문은 Hash table둜 κ΅¬ν˜„λ˜μ–΄ 전체 λ°μ΄ν„°μ˜ 검색이 ν•„μš”μ—†κΈ°μ— μ›ν•˜λŠ” 곳으둜 ν•œλ²ˆμ— 이동이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

  • μž₯점과 λ‹¨μ μ˜ μ‘°ν•©

νŒŒμ΄μ¬μ—λŠ” switch - case 문이 μ—†μ–΄μ„œ λΉ„μŠ·ν•˜κ²Œ λ”•μ…”λ„ˆλ¦¬λ‘œ κ΅¬ν˜„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ½”λ“œλŠ” 훨씬 κΈΈμ–΄μ‘Œμ§€λ§Œ μ‹€ν–‰λ¬Έκ³Ό 선언뢄이 ν™•μ‹€ν•˜κ²Œ λΆ„λ¦¬λ˜μ–΄ 가독성이 μ’‹μ•„μ§€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ•„λž˜ 방법1,2 λͺ¨λ‘ μ½”λ“œ 정닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 전체 ν”„λ‘œκ·Έλž¨ μ„±λŠ₯에 ν¬λ¦¬ν‹°μ»¬ν•˜κ²Œ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€ 고민해보고 μ„ νƒν•˜λŠ” 단계가 ν•„μš”ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

# 방법 1. 

# λ©”λͺ¨λ¦¬: 116608KB
# μ‹œκ°„: 164MS

import sys

input = sys.stdin.readline

N = int(input())
res = []
for _ in range(N):
    cmd = input().split()
    action, num = None, None
    
    if len(cmd) == 1:
        action = cmd[-1]
    else: 
        action, num = cmd
        
    if action == 'push':
        res.append(num)
        
    elif action == 'pop':
        if res:
            print(res.pop())
        else:
            print(-1)
    elif action == 'size':
        print(len(res))
    elif action == 'empty':
        if res:
            print(0)
        else:
            print(1)
    elif action == 'top':
        if res:
            print(res[-1])
        else:
            print(-1)
# 방법 2. 

# λ©”λͺ¨λ¦¬: 30616KB
# μ‹œκ°„: 44ms

import sys

input = sys.stdin.readline

def push(res, num):
    res.append(num)
    return res
    
def pop(res):
    if res:
        print(res.pop())
    else:
        print(-1)
    return res
    
def size(res):
    print(len(res))
    return res

def empty(res):
    if res:
        print(0)
    else:
        print(1)  
    return res
        
def top(res):
    if res:
        print(res[-1])
    else:
        print(-1) 
    return res

cmd_dict = {
    "push": push,
    "pop": pop,
    "size": size,
    "empty": empty,
    "top": top
}

N = int(input())
res = []
for _ in range(N):
    cmd = input().rstrip().split()
    if len(cmd) == 1:
        action = cmd[0]
        res = cmd_dict[action](res)
    else:
        action, num = cmd
        res = cmd_dict[action](res, num)