[ BAEKJOON ] 탑 / 2493 / Python

πŸ§‘πŸ»β€πŸ’» Coding Test/πŸ–ŒοΈ BAEKJOON ┃ 2025. 1. 9. 14:01
λͺ©μ°¨
  1. 문제
  2. μž…λ ₯
  3. 좜λ ₯
  4. λ‚˜μ˜ 풀이
  5. 둜직
  6. μ½”λ“œ

 

 

문제

KOI ν†΅μ‹ μ—°κ΅¬μ†ŒλŠ” λ ˆμ΄μ €λ₯Ό μ΄μš©ν•œ μƒˆλ‘œμš΄ λΉ„λ°€ 톡신 μ‹œμŠ€ν…œ κ°œλ°œμ„ μœ„ν•œ μ‹€ν—˜μ„ ν•˜κ³  μžˆλ‹€. μ‹€ν—˜μ„ μœ„ν•˜μ—¬ 일직선 μœ„μ— N개의 높이가 μ„œλ‘œ λ‹€λ₯Έ 탑을 μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½ λ°©ν–₯으둜 μ°¨λ‘€λ‘œ μ„Έμš°κ³ , 각 νƒ‘μ˜ κΌ­λŒ€κΈ°μ— λ ˆμ΄μ € 솑신기λ₯Ό μ„€μΉ˜ν•˜μ˜€λ‹€. λͺ¨λ“  νƒ‘μ˜ λ ˆμ΄μ € μ†‘μ‹ κΈ°λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ§€ν‘œλ©΄κ³Ό ν‰ν–‰ν•˜κ²Œ μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½ λ°©ν–₯으둜 λ°œμ‚¬ν•˜κ³ , νƒ‘μ˜ κΈ°λ‘₯ λͺ¨λ‘μ—λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” μž₯μΉ˜κ°€ μ„€μΉ˜λ˜μ–΄ μžˆλ‹€. ν•˜λ‚˜μ˜ νƒ‘μ—μ„œ λ°œμ‚¬λœ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” κ°€μž₯ λ¨Όμ € λ§Œλ‚˜λŠ” 단 ν•˜λ‚˜μ˜ νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ μ΄ κ°€λŠ₯ν•˜λ‹€.

예λ₯Ό λ“€μ–΄ 높이가 6, 9, 5, 7, 4인 λ‹€μ„― 개의 탑이 μˆ˜ν‰ 직선에 일렬둜 μ„œ 있고, λͺ¨λ“  νƒ‘μ—μ„œλŠ” μ£Όμ–΄μ§„ 탑 μˆœμ„œμ˜ λ°˜λŒ€ λ°©ν–₯(μ™Όμͺ½ λ°©ν–₯)으둜 λ™μ‹œμ— λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό λ°œμ‚¬ν•œλ‹€κ³  ν•˜μž. 그러면, 높이가 4인 λ‹€μ„― 번째 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” 높이가 7인 λ„€ 번째 탑이 μˆ˜μ‹ μ„ ν•˜κ³ , 높이가 7인 λ„€ 번째 νƒ‘μ˜ μ‹ ν˜ΈλŠ” 높이가 9인 두 번째 탑이, 높이가 5인 μ„Έ 번째 νƒ‘μ˜ μ‹ ν˜Έλ„ 높이가 9인 두 번째 탑이 μˆ˜μ‹ μ„ ν•œλ‹€. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 λ ˆμ΄μ € μ‹ ν˜ΈλŠ” μ–΄λ–€ νƒ‘μ—μ„œλ„ μˆ˜μ‹ μ„ ν•˜μ§€ λͺ»ν•œλ‹€.

νƒ‘λ“€μ˜ 개수 Nκ³Ό νƒ‘λ“€μ˜ 높이가 μ£Όμ–΄μ§ˆ λ•Œ, 각각의 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ–΄λŠ νƒ‘μ—μ„œ μˆ˜μ‹ ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

μž…λ ₯

첫째 쀄에 νƒ‘μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. N은 1 이상 500,000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” N개의 νƒ‘λ“€μ˜ 높이가 직선상에 놓인 μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. νƒ‘λ“€μ˜ λ†’μ΄λŠ” 1 이상 100,000,000 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 μ£Όμ–΄μ§„ νƒ‘λ“€μ˜ μˆœμ„œλŒ€λ‘œ 각각의 νƒ‘λ“€μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•œ νƒ‘λ“€μ˜ 번호λ₯Ό ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” 탑이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

 

 

예제 μž…λ ₯ 1


      
5
6 9 5 7 4

예제 좜λ ₯ 1


      
0 0 2 2 4

 


 

λ‚˜μ˜ 풀이

μ²˜μŒμ— 문제λ₯Ό 보자마자 되게 λ‹¨μˆœν•œ 둜직으둜 풀리겠닀고 생각을 ν–ˆλ‹€. λ¬Έμ œκ°€ λ‹¨μˆœν•˜μ—¬ 배열을 거꾸둜 λŒλ €μ„œ ν•΄λ‹Ή μΈλ±μŠ€λ³΄λ‹€ μ•žμ˜ 인덱슀λ₯Ό νƒμƒ‰ν•˜λ©° μžμ‹ λ³΄λ‹€ 큰 인덱슀 번호 + 1 을 좜λ ₯ν•˜λ©΄ λ˜κ² λ‹€κ³  μƒκ°ν–ˆλ‹€.

ν•˜μ§€λ§Œ, N값이 500,000으둜 κ·Έλ ‡κ²Œ 되면 for문을 두 번 λ„λŠ” 것과 κ°™μ•„ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(n^2) 으둜 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜κ²Œ λœλ‹€.

μ΅œμ ν™”ν•˜μ—¬ ν’€κΈ° μœ„ν•΄ μŠ€νƒμ„ λ„μž…ν•˜μ—¬ ν’€μ–΄μ•Ό ν•˜λŠ”λ°, μ‹œκ°„μ΄ˆκ³Όλ₯Ό ν•΄κ²°ν•  수 μ—†μ–΄μ„œ λ―Όμž¬λ‹˜μ˜ 도움을 λ°›μ•„ ν’€μ—ˆλ‹€!

 

둜직

stackμ—λŠ” κ°€μž₯ 큰 νƒ‘λ“€μ˜ 크기뢀터 μž‘μ€ 순으둜 배열이 λ˜λ„λ‘ μŒ“μ„ 것이닀.

그러면 ν˜„μž¬ λ‚˜μ˜ 탑 크기와 λΉ„κ΅ν•˜μ—¬ λ‚˜λ³΄λ‹€ 높은 탑을 λ°”λ‘œ 찾을 수 μžˆμ„ 것이닀.

 

예λ₯Ό λ“€μ–΄, 6 9 5 7 4 λΌλŠ” νƒ‘μ˜ 크기가 μ£Όμ–΄μ§ˆ λ•Œ, μ΅œμ’…μ μœΌλ‘œ stackμ—λŠ” 9 7 이 λ“€μ–΄μžˆμ„ 것이닀.

천천히 단계λ₯Ό μˆ˜ν–‰ν•˜λ©΄μ„œ μ ‘κ·Όν•΄λ³΄μž.

μ£Όμ–΄μ§„ νƒ‘μ˜ 크기의 첫번째 μΈλ±μŠ€λΆ€ν„° λ§ˆμ§€λ§‰ 인덱슀둜 μ ‘κ·Όν•  것이닀.

 

[ ν˜„μž¬ 탑 - 6 ]

ν˜„μž¬ 탑이 6이라고 ν•  λ•Œ, STACK 이 λΉ„μ–΄μžˆμœΌλ―€λ‘œ ν˜„μž¬ λ‚΄κ°€ κ°€μž₯ 높은 νƒ‘μ˜ 크기가 λœλ‹€.

STACK  6        
ANSWER 0        

STACKμ—λŠ” ν˜„μž¬ μ‹œμ μ—μ„œ κ°€μž₯ 큰 탑듀이 순차적으둜 λ“€μ–΄κ°ˆ ν…Œλ‹ˆ ν˜„μž¬ νƒ‘μ˜ 크기λ₯Ό μ €μž₯ν•΄μ€€λ‹€. ν˜„μž¬λ³΄λ‹€ 큰 탑이 μ™Όμͺ½μ— μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ‹ˆ λ‹΅μ—λŠ” λ‹Ήμ—°νžˆ 0이 λ“€μ–΄κ°ˆ 것이닀.

 

[ ν˜„μž¬ 탑 - 9 ]

STACK의 λ§ˆμ§€λ§‰λΆ€ν„° μ‘°μ‚¬ν•˜μ—¬ λ‚˜λ³΄λ‹€ 큰 탑이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•΄λ³΄μž.

ν˜„μž¬ STACK의 6은 ν˜„μž¬ 탑 크기 9보닀 μž‘μœΌλ―€λ‘œ 6μ΄λΌλŠ” 탑은 이후에 λ‚˜μ˜€λŠ” κ°’λ“€μ˜ 비ꡐ λŒ€μƒμ΄ 될 수 μ—†λ‹€.

STACK          
ANSWER 0        

6을 STACKμ—μ„œ μ œκ±°ν•˜κ³ , ν˜„μž¬ 탑 크기인 9λ₯Ό STACK에 λ„£μ–΄μ€€λ‹€.

STACK 6        
ANSWER 0 0      

μ΄λ•Œ ANSWERμ—λŠ” ν˜„μž¬λ³΄λ‹€ 큰 탑이 μ™Όμͺ½μ— μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ‹ˆ 0이 λ“€μ–΄κ°ˆ 것이닀.

 

[ ν˜„μž¬ 탑 - 5 ]

ν˜„μž¬μ˜ 5와 STACK에 μ €μž₯λ˜μ–΄ μžˆλŠ” κ°€μž₯ 큰 탑 9와 λΉ„κ΅ν•œλ‹€. 9κ°€ 더 크기 λ•Œλ¬Έμ— λ‹΅μ—λŠ” 9의 인덱슀 값인 2κ°€ λ“€μ–΄κ°€κ³ , ν˜„μž¬μ˜ 탑 크기가 STACK에 μ €μž₯λœλ‹€.

STACK 9 5      
ANSWER 0 0 2    

 

[ ν˜„μž¬ 탑 - 7 ]

ν˜„μž¬ νƒ‘μ˜ 크기인 7κ³Ό λ§ˆμ§€λ§‰μœΌλ‘œ 큰 νƒ‘μ˜ 크기 5λ₯Ό λΉ„κ΅ν•˜μ˜€μ„ λ•Œ, ν˜„μž¬ λ‚˜μ˜ 탑이 더 크기 λ•Œλ¬Έμ— 5λŠ” 더이상 비ꡐ λŒ€μƒμ΄ 될 수 μ—†λ‹€. 5λ₯Ό STACKμ—μ„œ μ œκ±°ν•΄μ€€λ‹€.

STACK 9        
ANSWER 0 0 2    

κ·Έλ‹€μŒ 9와 λΉ„κ΅ν•˜μ˜€μ„ λ•Œ, ν˜„μž¬ λ‚˜λ³΄λ‹€ 큰 탑이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— ANSWERμ—λŠ” 9의 μœ„μΉ˜ 값인 2κ°€ λ“€μ–΄κ°„λ‹€.

STACK 9        
ANSWER 0 0 2 2  

μΆ”κ°€λ‘œ ν˜„μž¬ νƒ‘μ˜ ν¬κΈ°κΉŒμ§€ STACK에 μŒ“μ•„μ€€λ‹€.

STACK  9 7      
ANSWER 0 0 2 2  

 

[ ν˜„μž¬ 탑 - 4 ]

λ§ˆμ§€λ§‰ ν˜„μž¬ νƒ‘μ˜ 크기인 4와 λΉ„κ΅ν•˜μ˜€μ„ λ•Œ, 7이 더 크기 λ•Œλ¬Έμ— ANSWERμ—” 7의 μœ„μΉ˜ 값인 4κ°€ λ“€μ–΄κ°€κ²Œ λœλ‹€.

STACK 9 7      
ANSWER 0 0 2 2 4

β‡’ κ²°λ‘ μ μœΌλ‘œλŠ” STACKμ—λŠ” 였λ₯Έμͺ½μœΌλ‘œ 갈 수둝 κ°€μž₯ 큰 νƒ‘μ—μ„œ μž‘μ€ 탑이 λ˜λŠ” 수만 정렬이 λœλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

 

 

μ½”λ“œ

μœ„μ˜ λ‘œμ§μ„ μ½”λ“œλ‘œ λ‚˜νƒ€λ‚  땐, STACK에 μ €μž₯λ˜λŠ” 값을 INDEX둜 μ €μž₯ν•˜μ—¬ ANSWER에 λ„£λŠ” κ°’κ³Ό νƒ‘μ˜ 크기 비ꡐλ₯Ό μ‰½κ²Œ ν•œλ‹€.


      
n = int(input())
lst = list(map(int, input().split()))
stack = []
answer = []
for idx, value in enumerate(lst):
if stack == []:
stack.append(idx)
answer.append(0)
else:
while stack:
if lst[stack[-1]] > value:
answer.append(stack[-1] + 1)
stack.append(idx)
break
else:
stack.pop()
else:
stack.append(idx)
answer.append(0)
for ans in answer:
print(ans, end=' ')

 

 

 

[ λ‚˜μ˜ μ˜€λ‹΅.. μΉœκ΅¬λ“€.. ]


      
n = int(input())
lst = list(map(int, input().split()))
beforeLength = 0
mxLength = 0
answer = list()
for i in range(n):
if lst[i] > beforeLength:
if lst[i] < mxLength:
# κ·Έ μ „ 탐색
for j in range(i - 1, -1, -1):
if lst[i] < lst[j]:
answer.append(j + 1)
else:
answer.append(0)
else:
answer.append(i)
beforeLength = lst[i]
if mxLength < lst[i]:
mxLength = lst[i]
for i in range(n):
print(answer[i], end=' ')

β†’ μ‹œκ°„ 초과!


      
n = int(input())
lst = list(map(int, input().split()))
stack = []
answer = []
for idx, value in enumerate(lst):
if stack == []:
stack.append(idx)
answer.append(0)
else:
for i in range(-1, -len(stack)-1, -1):
if lst[stack[i]] > value:
answer.append(stack[i] + 1)
stack.append(idx)
break
else:
answer.append(0)
stack = [idx]
for ans in answer:
print(ans, end=' ')

β†’ μ‹œκ°„ 초과!

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)
  1. 문제
  2. μž…λ ₯
  3. 좜λ ₯
  4. λ‚˜μ˜ 풀이
  5. 둜직
  6. μ½”λ“œ
'πŸ§‘πŸ»β€πŸ’» Coding Test/πŸ–ŒοΈ BAEKJOON' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [ BAEKJOON ] λ¬Έμžμ—΄ κ²Œμž„ 2 / 20437 / Python
  • [ BAEKJOON ] 1, 2, 3 λ”ν•˜κΈ° 4 / 15989 / Python
  • [ BAEKJOON ] μ’Œν‘œ μ••μΆ• / 19970 / Python
  • [ BAEKJOON ] 톡계학 / 2108 / Python
EarthSea
EarthSea
μ£Όλ‹ˆμ–΄ 개발자 μ§Έμž…λ‹ˆλ‹€ 🌱

λΈ”λ‘œκ·Έ 메뉴

  • κΈ€μ“°κΈ°
EarthSea
EarthSea's Log🌏
EarthSea

곡지사항

  • EarthSea's Introduce
  • λΆ„λ₯˜ 전체보기
    • ✏️ TIL
    • πŸ“‘ Project
    • πŸ“’ Study
      • 🌐 React
      • 🚩 Swift
      • πŸ“ UIKit
      • πŸ–€ Git
      • 🩡 Python
    • πŸ§‘πŸ»β€πŸ’» Coding Test
      • ⌨️ Programmers
      • πŸ–ŒοΈ BAEKJOON
    • πŸŽ† SSAFY
    • 🍎 Apple
    • 🏷️ Tistory
    • 였둯이 λ‚˜μ˜ μ‹œκ°„
Total
Today
Yesterday
hELLO Β· Designed By μ •μƒμš°.v4.2.2
EarthSea
[ BAEKJOON ] 탑 / 2493 / Python
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”

단좕킀

λ‚΄ λΈ”λ‘œκ·Έ

λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
Q
Q
μƒˆ κΈ€ μ“°κΈ°
W
W

λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
E
E
λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
C
C

λͺ¨λ“  μ˜μ—­

이 νŽ˜μ΄μ§€μ˜ URL 볡사
S
S
맨 μœ„λ‘œ 이동
T
T
ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
H
H
단좕킀 μ•ˆλ‚΄
Shift + /
⇧ + /

* λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.