티스토리 뷰

 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net


문제
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력 1 
5
20 10 35 30 7
예제 출력 1 
7 35

 


 

 

매우 단순하고 쉽게 해결할 수 있는 문제지만,

최댓값, 최솟값 구할 때 다양한 방법으로 구현할 수 있지 않을까 싶었다.

 

처음에 바로 생각하고 푼 방법은 당연하게도 min과 max 함수.

갑자지 출력 방식에서 속도나 메모리 차이가 유의미한지 궁금해져 2가지로 나눠 실행해보았다.

 

 

방법1) min, max 함수 활용

1-1) 함수를 적용한 값 바로 출력

1-2) 리스트 → 문자열로 바꿔 출력했을 때 

 

큰 차이는 없지만 예상과는 다르게 리스트를 문자열로 출력하는 방법이

시간은 걸리지만 메모리를 상대적으로 덜 차지한 것을 볼 수 있었다. 

# 방법1) max, min 함수 활용
N = int(input())
data = list(map(int, input().split()))

# 1-1) 함수값 바로 출력
## 메모리: 154060KB | 시간: 408ms
print(min(data), max(data))

# 1-2) 리스트 값을 문자열로 출력
# 메모리: 149432KB | 시간: 424ms
results = [min(data), max(data)]
print(' '.join(map(str, results)))

 

 

 

 

방법2) 1차원 배열 활용

min과 max 말고 배열을 활용한 방식으로 구할 수 있지 않을까 싶어 다른 코드를 구현해봤는데, 시간이 더 걸렸다.

메모리는 1-2)와 동일했으나 시간 효율로 봤을 땐 좋지 않아 방법1)의 min / max가 가장 효과적이다.

# 방법2. 1차원 배열 활용하기
## 메모리: 149432KB | 시간: 600ms
N = int(input())
data = list(map(int, input().split()))
minNum = data[0]
maxNum = data[0]

for i in range(len(data)):
    # 최솟값 구하기
    if minNum > data[i]:
        minNum = data[i]
    # 최댓값 구하기
    if maxNum < data[i]:
        maxNum = data[i]
   
print(minNum, maxNum)

 

댓글