알고리즘/백준

[BOJ#30892] 상어 키우기

Jinoo.keem 2024. 4. 16. 16:34
728x90

https://www.acmicpc.net/problem/30892

 

30892번: 상어 키우기

첫째 줄에 인천대학교 앞바다에 존재하는 상어의 마릿수 $N$과, 샼이 먹을 수 있는 상어의 최대 마릿수 $K$, 샼의 최초 크기를 나타내는 정수 $T$가 공백으로 구분되어 주어진다. $(1\le K \leq N \le 200,

www.acmicpc.net


많은 시행착오가 있었다..

제출 코드

N, K, T = map(int, input().split())
shark = list(map(int, input().split()))
shark.sort(reverse=True)

cnt = 0
st = []
feed = T
while cnt < K:
    
    if shark and shark[-1] < T: # 샤크에서 T보다 작은 애들을 꺼내서 순서대로저장
        st.append(shark.pop()) # 스택에 추가
    else:
        if st:
            feed = st.pop() # 꺼내서 저장
        else:
            print(T)
            exit()
       
        T += feed
        cnt += 1

print(T)

 

먹이가 될 상어들을 내림차순으로 받아두고, 먹는 횟수만큼 순회를 한다고 정의한다.

먹이가 될 상어가 있고, 마지막에 있는 상어가(내림차순이라 제일 작은상어다) 샼보다 작다면

pop으로 새로운 st 리스트에 차례로 저장한다. - 이 경우 먹지는 않아서 cnt 가 늘어나진 않음

 

먹이가 될 상어가 없거나, 상어 리스트에 마지막에 들어온 상어가 샼보다 크다면 else 문으로 들어가서

조건문을 지나고 먹은 횟수를 추가해주고 샼의 크기를 키워준다.

 

샼의 크기가 갱신되기 때문에 while 문을 돌 때마다 커진 샼을 기준으로 조건문을 실행할 수 있고,

결과적으로 상어 리스트를 한번 순회하는 것이기 때문에 시간 복잡도에서도 자유로워질 수 있었다.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ#6198] 옥상 정원 꾸미기  (1) 2024.04.17
[BOJ#10994] 별 찍기 - 19  (0) 2024.04.16
[BOJ#25418] 정수 a를 k로 만들기  (0) 2024.04.16
[BOJ#4963] 섬의 개수  (0) 2024.04.13
[BOJ#14888] 연산자 끼워넣기  (0) 2024.04.12