티스토리 뷰
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)
'CS > Algorithm' 카테고리의 다른 글
[프로그래머스] 최소직사각형 (JavaScript) (0) | 2023.01.18 |
---|---|
[자료구조] 파이썬으로 스택(Stack), 큐(Queue) 구현하기 (0) | 2022.04.11 |
[알고리즘] 모두의 알고리즘 | 넷째마당 (0) | 2022.02.28 |