관리 메뉴

CS Student’s SAP&Tech JourneyπŸ’«

[λ°±μ€€] 1874번: μŠ€νƒ μˆ˜μ—΄ λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ | ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ | μ†Œν”„ν‹°μ–΄

[λ°±μ€€] 1874번: μŠ€νƒ μˆ˜μ—΄

μΈν¬λ§ˆν‹± 2024. 11. 11. 12:24

1. λ°±μ€€ 1874번 μŠ€νƒ μˆ˜μ—΄

[λ°±μ€€] 1874번: μŠ€νƒ μˆ˜μ—΄

 

2. 였늘의 νšŒκ³ 

 

0. 문제 뢄석

 

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€. μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ κ°€μ§€κ³  μžˆλ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— push ν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž. μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

: 문제λ₯Ό 톡해 μŠ€νƒ μžλ£Œκ΅¬μ‘°μ— λŒ€ν•œ κ°œλ…μ„ ν•œλ²ˆ 더 읡힐 수 μžˆλŠ” 쒋은 λ¬Έμ œμ΄λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆλ“―μ΄ μŠ€νƒμ€ 자료λ₯Ό 넣은 μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” μž…κ΅¬κ°€ 같은 자료ꡬ쑰둜, 택배 μƒν•˜μ°¨ λ°•μŠ€ μŒ“κΈ°μ— λΉ—λŒ€μ–΄ λ§ν•œλ‹€. 보톡 졜근 κ°’λ§Œ 확인해야 ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€ λ•Œ μ‚¬μš©ν•œλ‹€.

 

1. μž…λ ₯

첫 쀄에 n (1 ≤ n ≤ 100,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1 이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.

 

: 같은 μˆ«μžκ°€ λ‚˜μ˜€λŠ” 일은 μ—†λ‹€λŠ” 것을 μΊμΉ˜ν•˜κ³  κ°„λ‹€.

 

2. 좜λ ₯

μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

 

: μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“œλŠ” 과정을 + 와 - 둜 ν‘œν˜„ν•΄μ•Ό ν•œλ‹€.

 

3. 문제 μ ‘κ·Ό

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— push ν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž. μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

 

문제λ₯Ό μ΄ν•΄ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€. 1λΆ€ν„° nκΉŒμ§€ 수λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ push ν•  수 있고, pop은 상관없닀.

 

예λ₯Ό λ“€μ–΄ 1λΆ€ν„° nκΉŒμ§€μ— μˆ˜μ— λŒ€ν•΄ μ°¨λ‘€λ‘œ [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 μˆ˜ν–‰ν•˜λ©΄ μˆ˜μ—΄ [4, 3, 6, 8, 7, 5, 2, 1]λ₯Ό 얻을 수 μžˆλ‹€.

while λ°˜λ³΅λ¬Έμ„ ν™œμš©ν•˜μ—¬ 1λΆ€ν„° 빈 배열에 pushλ₯Ό ν•˜κ³  κ·Έ κ°’(= λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μ›μ†Œ)을 μž…λ ₯받은 μˆ˜μ—΄μ˜ 첫 μ›μ†Œ 4와 λΉ„κ΅ν•œλ‹€. μ›μ†Œκ°€ 같을 μ‹œ, 또 λ‹€λ₯Έ 빈 배열에 μΆ”κ°€ν•˜κ³  pop ν•œλ‹€. 아닐 μ‹œ +1 ν•˜μ—¬ push ν•œλ‹€.

 

얕은 볡사 κΉŠμ€ 볡사

얕은 볡사: μ›λ³Έκ°μ²΄μ˜ μ΅œμƒμœ„ 레벨만 λ³΅μ‚¬ν•œλ‹€. 원본 객체의 ν•˜μœ„ 객체만 λ³΅μ‚¬λ˜λ―€λ‘œ, λ³΅μ‚¬λ³Έμ˜ ν•˜μœ„ 객체λ₯Ό μˆ˜μ •ν•˜λ©΄ 원본 객체에도 영ν–₯을 λ―ΈμΉœλ‹€. 예λ₯Ό λ“€μ–΄ μ•„λž˜λŠ” nlist의 얕은 볡사λ₯Ό 톡해 rlistλ₯Ό μƒμ„±ν–ˆλ‹€. nlistλŠ” μ€‘μ²©λœ λ¦¬μŠ€νŠΈκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— rlistκ°€ nlist의 μ΅œμƒμœ„ μš”μ†Œλ“€μ„ κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜λ‹ˆ 얕은 볡사λ₯Ό 해도 λ¬Έμ œλŠ” λ˜μ§€ μ•ŠλŠ”λ‹€.

rlist = nlist[:]

 

얕은 볡사: μ›λ³Έ 리슀트의 λͺ¨λ“  ν•˜μœ„ κ°μ²΄κΉŒμ§€ μ™„μ „νžˆ μƒˆλ‘œμš΄ 객체둜 λ³΅μ‚¬λœλ‹€. λͺ¨λ“  ν•˜μœ„ μš”μ†Œλ₯Ό μž¬κ·€μ μœΌλ‘œ λ³΅μ‚¬ν•˜λŠ” 방법이닀. μ€‘μ²©λœ λ¦¬μŠ€νŠΈλ‚˜ 객체가 ν¬ν•¨λœ κ²½μš°μ—λŠ” κΉŠμ€ 볡사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

import copy

nlist = [[1, 2], [3, 4]]
rlist = copy.deepcopy(nlist)

 

while μ’…λ£Œμ‘°κ±΄ μ„€μ •

반볡문이 λ¬΄ν•œ 루프에 λΉ μ§€μ§€ μ•Šλ„λ‘ μ’…λ£Œμ‘°κ±΄μ„ 잘 μ„€μ •ν•΄μ€˜μ•Ό ν•œλ‹€.

 

μ •λ‹΅μ½”λ“œ

n = int(input())
nlist = []
alist = []
blist = []
cnt = 0
result = []
for i in range(n):
    a = int(input())
    nlist.append(a)

rlist = nlist[:] # 얕은 볡사λ₯Ό ν•˜μ§€μ•ŠμœΌλ©΄ μ›λ³Έλ¦¬μŠ€νŠΈκ°€ λ³€ν• λ•Œ 볡사본도 ν•¨κ»˜ λ³€ν•˜κ²Œ λœλ‹€
while cnt < n: # 루프λ₯Ό κ°•μ œ μ’…λ£Œν•˜λŠ” 쑰건을 잘 μ„€μ •! 반볡문이 λ¬΄ν•œ 루프에 λΉ μ§€μ§€ μ•Šκ²Œ κ΄€λ¦¬ν•˜λŠ” 쑰건
    if alist and alist[-1] == nlist[0]:
        alist.pop()
        blist.append(nlist[0])
        nlist.pop(0)
        result.append("-")
    else:
        cnt = cnt+1
        alist.append(cnt)
        result.append("+")

while alist: # μžλ£Œκ°€ λ‚¨μ•„μžˆμ„λ•ŒκΉŒμ§€ μ²˜λ¦¬ν•˜λŠ” νŒ¨ν„΄ while 리슀트:
    blist.append(alist.pop())
    result.append("-")

if rlist == blist:
    print(*result, sep='\n')
else:
    print("NO")