Skip to content

BOJ 10845 ํ ํ’€์ดย #4

Description

@allzeroyou

๋ฌธ์ œ ๋ถ„์„

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„(๋ฌธ์ œ ์š”์•ฝ ๋ฐ ์กฐ๊ฑด ํŒŒ์•…)

์ •์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ ๊ตฌํ˜„ํ•˜๊ณ , ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ช…๋ น ์ฒ˜๋ฆฌ

๋ช…๋ น์€ ์ด 6๊ฐ€์ง€

  • push x: ์ •์ˆ˜ x๋ฅผ ํ์— ๋„ฃ์Œ

  • pop: ํ์—์„œ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ์ •์ˆ˜ ๊บผ๋‚ด๊ธฐ, ๊ทธ ์ˆ˜๋ฅผ ์ถœ๋ ฅ. ๋งŒ์•ฝ ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด -1 ์ถœ๋ ฅ

  • size: ํ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ

  • empty: ํ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0 ์ถœ๋ ฅ

  • front: ํ์—์„œ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ์ •์ˆ˜ ์ถœ๋ ฅ. ๋งŒ์•ฝ ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด -1 ์ถœ๋ ฅ

  • back: ํ์—์„œ ๊ฐ€์žฅ ๋’ค์— ์žˆ๋Š” ์ •์ˆ˜ ์ถœ๋ ฅ. ๋งŒ์•ฝ ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด -1 ์ถœ๋ ฅ

  • ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ฃผ์–ด์ง€๋Š” ๋ช…๋ น์˜ ์ˆ˜ N (1 โ‰ค N โ‰ค 10,000)์ด ์ฃผ์–ด์ง.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋ช…๋ น์ด ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค

์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜๋Š” 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค. ๋ฌธ์ œ์— ๋‚˜์™€์žˆ์ง€ ์•Š์€ ๋ช…๋ น์ด ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

  • ์ถœ๋ ฅ

์ถœ๋ ฅํ•ด์•ผํ•˜๋Š” ๋ช…๋ น์ด ์ฃผ์–ด์งˆ ๋•Œ๋งˆ๋‹ค, ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„ (๋ฌธ์ œ ํ•ต์‹ฌ ํŒŒ์•…)

6๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ํ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค

ํŒŒ์ด์ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ์ธ deque๋ฅผ ์ด์šฉํ•˜์ž

  • ํ ๊ตฌํ˜„์‹œ list๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ 

    ์Šคํƒ์—์„œ list.append์™€ list.pop()์„ ์ด์šฉํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ list.append์™€ list.pop(0)์„ ์ด์šฉํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ๋ฅผ ํ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ pop()์˜ time complexity๋Š” O(1)์ธ ๋ฐ˜๋ฉด pop(0)์˜ time complexity๋Š” O(N)์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•ด ๋ฆฌ์ŠคํŠธ๋Š” ํ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ

import collections
import sys

input = sys.stdin.readline

q = collections.deque()  # ํ ์ƒ์„ฑ
n = int(input())

for _ in range(n):
    command = input().split()
    if command[0] == "push":  # push ๋ช…๋ น
        q.append(command[1])
    elif command[0] == "front":
        if not q:  # ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด
            print(-1)
        else:
            print(q[0])
    elif command[0] == "back":
        if not q:  # ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด
            print(-1)
        else:
            print(q[-1])
    elif command[0] == "size":
        print(len(q))
    elif command[0] == "empty":
        if not q:  # ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด
            print(1)
        else:
            print(0)
    elif command[0] == "pop":
        if not q:  # ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด
            print(-1)
        else:
            print(q.popleft())

๋А๋‚€์ 

deque vs heapq

deque๋Š” ์Šคํƒ+ํ ์ž๋ฃŒ๊ตฌ์กฐ. ๊ฐ€์žฅ์ž๋ฆฌ์˜ ์›์†Œ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๋‹ค. pop()๊ณผ popleft() ๋ชจ๋‘ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)๋กœ ๋งค์šฐ ์ข‹๋‹ค.

๋ฉ”์„œ๋“œ ์„ค๋ช…
deque(iterable, [, maxlen]) ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜์ด๋‹ค. iterable(๋ฆฌ์ŠคํŠธ ๋“ฑ)์„ ์ธ์ž๋กœ ๊ฑด๋‚ด๋ฉด ์ด๋ฅผ dequeํ™” ์‹œ์ผœ์ค€๋‹ค.
append(x) x๋ฅผ ๋ฑ์˜ ์˜ค๋ฅธ์ชฝ์— ์‚ฝ์ž…ํ•œ๋‹ค.
popleft() ๋ฑ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๋ฑ์—์„œ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
clear() ๋ชจ๋“  ์›์†Œ๋ฅผ ์ง€์šด๋‹ค.

heapq๋Š” ์šฐ์„ ์ˆœ์œ„ ํ. ์ตœ์†Œ ํž™์„ ์ง€์›ํ•˜๋ฉฐ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์— ์‚ฌ์šฉ๋จ.

  • ๊ทผ๋ฐ ํž™์€ ๋ญ”๋ฐ?
    • ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ.

    • ์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ฮŸ(n)๋งŒํผ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

      ํ•˜์ง€๋งŒ ํž™์„ ์‚ฌ์šฉํ•˜๋ฉด O(logn)๋งŒํผ ์†Œ์š”๋˜๋ฏ€๋กœ, ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

      ์šฐ์„ ์ˆœ์œ„ ํ์™€ ๊ฐ™์ด ์ตœ๋Œ“๊ฐ’ ๋˜๋Š” ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์•ผํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์— ํ™œ์šฉ๋œ๋‹ค.

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions