PS (C, C++)

[백준/C] 1차원 배열

최연재 2022. 8. 20. 01:56

10818 최소, 최대

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int n;
	scanf("%d", &n);
	int* ptr = (int*)malloc(n * sizeof(int));

	for (int i = 0; i < n; i++) scanf("%d", &ptr[i]);

	int min = ptr[0];
	int max = ptr[0];

	for (int i = 1; i < n; i++)
	{
		if (min > ptr[i]) min = ptr[i];
		if (max < ptr[i]) max = ptr[i];
	}

	printf("%d %d", min, max);
	free(ptr);
	return 0;
}

동적할당을 사용해서 배열을 선언한다. 반복문을 돌면서 최댓값과 최솟값을 구해 출력한다. 

2562 최댓값

#include <stdio.h>

int main()
{
	int arr[10];
	for (int i = 0; i < 9; i++) scanf("%d", &arr[i]);
	int index = 1, max = arr[0];
	for (int i = 1; i < 9; i++)
	{
		if (max < arr[i])
		{
			max = arr[i];
			index = i + 1;
		}
	}
	printf("%d\n", max);
	printf("%d", index);
	return 0;
}

몇 번째 수인지 출력할 때의 순서는 1부터 세는 것을 유의해서 최댓값의 인덱스에 1을 더해 출력할 값을 구한다. 

3052 나머지

#include <stdio.h>

int countNumber(int arr[], int size)
{
	int result = 0;
	for (int i = 0; i < size - 1; i++) for (int j = i + 1; j < size; j++) if (arr[i] == arr[j]) arr[j] = -1;
	for (int i = 0; i < size; i++) if (arr[i] != -1) result++;

	return result;
}

int main()
{
	int arr[11], rest[11], result[11] = {0};
	for (int i = 0; i < 10; i++) scanf("%d", &arr[i]);
	for (int i = 0; i < 10; i++) rest[i] = arr[i] % 42; 
	printf("%d", countNumber(rest, 10));
	return 0;
}

입력받은 값들을 42로 나눈 나머지를 구해서 rest라는 배열에 저장한다. 

countNumber라는 함수에서는 배열의 값들 비교를 통해서 앞에서 나왔던 값이 나온 경우에는 -1로 저장한다. 

반복문을 돌면서 -1이 아닌 값(==처음 나온 값)이 나올 경우 result를 1씩 증가시킨다. 

1546 평균

#include <stdio.h>

double findMax(double arr[], int n)
{
	double result = arr[0];
	for (int i = 1; i < n; i++) if (result < arr[i]) result = arr[i];
	return result;
}

int main()
{
	int n;
	double grade[1001], sum = 0.0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) scanf("%lf", &grade[i]);
	double max = findMax(grade, n);

	for (int i = 0; i < n; i++)
	{
		grade[i] = grade[i] / max * 100;
		sum += grade[i];
	}
	printf("%.10lf", sum/n);

	return 0;
}

grade 배열은 실수를 저장하도록 선언한다. 성적들을 입력받은 후 max 함수를 사용해서 최댓값을 찾아 반환한다.  최댓값을 이용해서 점수/최댓값*100을 각각의 점수에 적용해서 구한 값을 원래 점수를 저장하는 배열에 저장한다. 그리고 반복문을 돌면서 값을 계속 더해나간다. 

절대오차 또는 상대오차가 10^(-2) 이하면 정답이므로 소수점 이하 자리를 넉넉하게 해서 결과를 출력한다.  

8958 OX퀴즈

#include <stdio.h>

int main()
{
	int n, result = 0, grade[100] = {0};
	char input[100][81];
	scanf("%d", &n);

	for (int i = 0; i < n; i++) scanf("%s", &input[i]);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; input[i][j] != '\0'; j++)
		{
			if (input[i][j] == 'X') result = 0;
			else
			{
				result++;
				grade[i] += result;
			}
		}
		result = 0;
	}

	for (int i = 0; i < n; i++) printf("%d\n", grade[i]);
	return 0;
}

x가 나올 때마다 점수가 0이 되므로 조건문으로 입력된 값의 경우를 x인 경우와 0인 경우를 나눠서 식을 작성한다. 한 줄을 계산한 후에는 result를 반드시 0으로 초기화해야 한다. 

4344 평균은 넘겠지

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n;
	scanf("%d", &n); // 테스트 케이스 개수
	int* gradeNum = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++)
	{
		float count = 0, sum = 0;
		scanf("%d", &gradeNum[i]);
		int* grade = (int*)malloc(gradeNum[i] * sizeof(int));
		for (int j = 0; j < gradeNum[i]; j++)
		{
			scanf("%d", &grade[j]);
			sum += grade[j];
		}
		float ave = sum / gradeNum[i];
		for (int j = 0; j < gradeNum[i]; j++) if (ave < grade[j]) count++;
		printf("%.3f%%\n", count / gradeNum[i] * 100);
	}
	return 0;
}

성적을 입력받으면서 바로 sum을 더해나간다. 성적 입력이 끝나고 평균을 구한다. 다시 반복문을 돌면서 성적이 평균을 넘는 경우를 세고, 센 값을 성적의 입력개수로 나눈 후 100을 곱해 비율을 출력한다. 

'PS (C, C++)' 카테고리의 다른 글

[백준/C] 문자열  (0) 2022.08.20
[백준/C] 함수  (0) 2022.08.20
[백준/C] 반복문  (0) 2022.08.20
[백준/C] 조건문  (0) 2022.08.20
[백준/C] 입출력과 사칙연산  (0) 2022.08.20