본문 바로가기

Algorithm/Greedy

숫자 카드 게임

 

문제

- 여러개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한장을 뽑는다

- 카드는 행, 열로 구성되어 있다.

- 찾는 순서는 행선택,  그 행에서 가장 숫자가 낮은 카드를 뽑는다.

- 행을 선택할때 해당 행에서 가장 낮은 숫자를 뽑는 구조인데 이를 고려해, 행마다 가장 낮은 숫자 중 가장 높은 숫자를 뽑도록 해야한다.

- 용량 : 128MB, 시간 : 1초

 - 1 <= N,M <= 100

- 1 <= 숫자 <= 10000

 

입력 예시

3 3 (행, 열)

3 1 2

4 1 4

2 2 2

 

출력예시

2

 

 

해결

유형 파악

- "가장 높은"이 들어가므로 그리디 알고리즘을 의심한다.

- 또한 이는 다른 알고리즘으로 해결이 불가능해 보인다.

 

아이디어

- 행마다 가장 작은 수를 고르고 그 중 가장 큰 수를 찾는다

 

정당성

- 직관적이므로 굳이 체크안해도 될 것 같다.

 

구현

- 행마다 입력을 받을때마다 제일 작은 수를 리스트에 넣어 놓는다. 문제의 용량이 128MB이기 때문에 용량을 좀 써도 된다.

- 그 중 가장 큰 수를 출력

 

코드

import time
n, m = map(int, input("입력 : ").split())
data = []
result = []
for i in range(n):
    data.append(list(map(int, input("입력 : ").split())))
    result.append(min(data[i]))

start_time = time.time()
print(max(result))
end_time = time.time()
print("time : ", end_time - start_time)

 

 

용량 체크

- 데이터를 담을 리스트는 Int가 4바이트이고, N,M의 최대값이 100이므로 최대 40000바이트 차지

- 결과를 담을 리스트는 최대 400바이트 이므로 둘이 더해도 용량을 넘지 않는다.

 

시간 체크

- 시간을 고려해야할 부분은 오직 max연산 밖에 없다.

- Max, Min  시간 복잡도 : O(N)

- 전체 프로그램 시간 복잡도 : O(N)

 

 

 

 

 

 

 

 

 

'Algorithm > Greedy' 카테고리의 다른 글

곱하기 혹은 더하기  (0) 2023.04.04
모험가 길드  (0) 2023.04.04
1이 될 때까지  (0) 2023.04.04
큰 수의 법칙  (0) 2023.04.03
Greedy - Concept  (0) 2023.04.03