티스토리 뷰
https://www.acmicpc.net/problem/10818
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
코드 1)
#include <stdio.h>
int main()
{
int N; // N개의 정수
int max, min; //최대값, 최소값 변수 선언
int num[1000000] = { 0 };
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &num[i]); //N개의 정수를 입력받기
max = min = num[0];
for (int i = 0; i < N; i++)
{
if (max < num[i])
max = num[i];
if (min > num[i])
min = num[i];
}
printf("%d %d", min, max);
}
맨 처음 main 3번째 줄 코드를 int num[100]={0};이라고 뒀는데 자꾸 런타임 에러가 났다. 문제에서 N이 1000000 까지 올 수 있다고 적혀있는데 배열 'num'의 크기를 100으로 고정시켰기 때문이다. 만약 입력받는 N의 값이 100을 넘어서면 배열의 크기를 초과하게 되어 런타임 에러가 발생한다.
따라서 num 배열의 크기를 입력받은 N의 값으로 동적으로 할당해주는 방법을 사용하는게 적절하다. (코드 2)
코드 2) 동적할당
#include <stdio.h>
#include <stdlib.h> // malloc 함수를 사용하기 위한 헤더 파일
int main()
{
int N; // N개의 정수
int max, min; //최대값, 최소값 변수 선언
int* num = NULL; // 배열 포인터 초기화
scanf("%d", &N);
// 동적 메모리 할당
num = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++)
scanf("%d", &num[i]); //N개의 정수를 입력받기
max = min = num[0];
for (int i = 0; i < N; i++)
{
if (max < num[i])
max = num[i];
}
for (int i = 0; i < N; i++)
{
if (min > num[i])
min = num[i];
}
printf("%d %d", min, max);
// 동적 메모리 해제
free(num);
return 0;
}
배열은 포인터의 일종으로, 배열 변수는 첫 번째 요소의 주소를 나타내는 포인터로 해석될 수 있다. 따라서 'int* num=NULL;'에서 'num'은 배열 포인터로 선언된 것이다. 배열포인터는 일반 포인터와 동일하게 사용되며, 'num'이 배열임을 나타내기 위해서는 동적 메모리 할당 과정에서 '(int*)'을 사용하여 정수형 배열 포인터임을 명시해주었다.
또한 'sizeof(int)*N'을 활용하여 필요한 바이트 크기의 메모리를 할당 시켜준다.
'알고리즘 > beakjoon' 카테고리의 다른 글
[백준][C] 2562 _ 최댓값 (0) | 2023.04.12 |
---|---|
[백준][C] 10871 _ X보다 작은 수 (0) | 2023.04.03 |
[백준][C] 10807 _ 개수 세기 (0) | 2023.04.03 |
[백준][C] 반복문 (0) | 2023.03.31 |