EarthSea 2025. 1. 9. 14:01

 

 

문제

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=' ')

→ μ‹œκ°„ 초과!