[BOJ_step_05]1차원 배열

4 분 소요

1차원 배열

어렵진 않지만 슬슬 문제들의 난이도가 올라가고 있다. 풀었던 문제들은 다시 한 번 리뷰 해보고, 새로운 문제들은 좀 더 꼼꼼히 풀어보자.

최소 최대(10818)

입력되는 정수의 범위가 -1000000 ~ 1000000 이므로
최댓값: -1000000, 최솟값: 1000000 으로 놓고 정수를 입력받을 때 마다 입력된 수가 최댓값인지, 최솟값인지 비교한다.

#include<cstdio>
int MAX = -1000000;
int min = 1000000;
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int a;
		scanf("%d", &a);
		if (MAX < a)MAX = a;
		if (min > a)min = a;
	}
	printf("%d %d\n", min, MAX);
	return 0;
}

최댓값(2562)

위 문제와 마찬가지로 입력받으면서 최댓값을 찾고 최댓값일 경우에 해당 인덱스를 저장한다.
이번엔 입력값들이 자연수 이므로 MAX = 0으로 초기화

#include<cstdio>
int MAX = 0;
int main() {
	//freopen("2562.in", "r", stdin);
	int a, idx;
	for (int i = 0; scanf("%d", &a) != EOF; i++) {
		if (MAX < a) {
			MAX = a;
			idx = i + 1;
		}
	}
	printf("%d\n%d", MAX, idx);	
	return 0;
}

음계(2920)

이 문제는 숫자가 오름차순인지 내림차순인지 아닌지를 구별하는 문제였다. 숫자의 범위가 1~8까지로 매우 제한적이어서 쉽게 풀 수 있었다.
만약 첫번째 숫자가 1이면 내림차순인지는 구별할 필요가 없으므로 오름차순인지 내림차순인지만 구별할 수 있게 isAscendingture로 해두고 다음 숫자와 현재 숫자와 차이가 1보다 크면 false로 바꾼다.그리고 반복문이 끝까지 오면 그 숫자는 오름차순이므로 ascending을 출력한다.
만약 첫번째 숫자가 1이 아니라서 isAscendingfalse이면 그 숫자가 8이 아닌경우에는 다음 숫자와 현재 숫자의 차이가 계속해서 1이 될 수 없으므로 mixed를 출력하고 반복문을 종료한다.
그리고 반복문이 끝까지 오면 그 숫자는 내림차순이므로 descending을 출력한다.

#include<cstdio>
int Scale[8];
bool isAscending;
int main() {
	//freopen("2920.in", "r", stdin);
	isAscending = false;
	for (int i = 0; i < 8; i++)
		scanf("%d", &Scale[i]);
	if (Scale[0] == 1)isAscending = true;
	for (int i = 1; i < 8; i++) {
		if (isAscending) {
			if (Scale[i - 1] - Scale[i] != -1) {
				printf("mixed\n"); break;
			}
			if (i == 7) printf("ascending\n");
		}
		if (!isAscending) {
			if (Scale[i - 1] - Scale[i] != 1) {
				printf("mixed\n"); break;
			}
			if (i == 7)printf("descending\n");
		}
	}
	return 0;
}

숫자의 개수(2577)

세 개의 세자리 자연수를 입력받고 그 세 수의 곱의 각 자릿수의 숫자가 몇 번씩 쓰였는지 구하는 문제이다.
10개의 정수형 배열을 만들고 그 인덱스를 해당 숫자라고 생각하고 카운팅 한다. 몇 자리 수 인지 계산을 하고 그 자리수만큼의 10의 거듭제곱을 이용하여 곱한 수를 나누어 해당 숫자의 배열을 카운팅 한다.

#include<cstdio>
int c[10];
int main() {
	int a, b = 1, d = 1, e;
	for (int i = 0; i < 3; i++) {
		scanf("%d", &a);
		b *= a;
	}
	e = b;
	while (e) {
		e /= 10;
		d *= 10;
	}
	d /= 10;
	while (d) {
		int k = b / d;
		c[k]++;
		b = b - k * d;
		d /= 10;
	}
	for (int i = 0; i < 10; i++) printf("%d\n", c[i]);
	return 0;
}

나머지(3052)

10개의 수를 입력받은 뒤, 42로 나눈 나머지를 구하고 서로 다른 나머지의 개수를 세는 문제이다.
10가지 숫자는 0보다 크고 1000보다 작은 정수 이다.
42로 나눈 나머지이기 때문에 나올 수 있는 나머지는 0~41이며 만약 나머지가 같다면 10개의 수를 입력받았기 때문에 10을 1씩 감소 시켜주면 서로 다른 나머지의 개수를 알 수 있다.

#include<cstdio>
int n[42];
int main() {
	int a, b, cnt = 10;
	for (int i = 0; i < 10; i++) {
		scanf("%d", &a);
		b = a % 42;
		n[b]++;
		if (n[b] > 1)cnt--;
	}
	printf("%d", cnt);
	return 0;
}

평균(1546)

#include<cstdio>
int A[1000];
int main() {
	int N, Max = 0;
	double Result = 0;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &A[i]);
		if (Max < A[i])Max = A[i];
	}
	for (int i = 0; i < N; i++)
		Result += (double)A[i] / Max * 100;
	printf("%.2lf", (double)Result / N);
	return 0;
}

OX 퀴즈(8958)

문제를 연속하여 맞출 때마다 점수가 증가 한다.
“OOXXOXXOOO”의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. X이면 Score=0으로 초기화 O이면 점수를 누적해서 더한다.

#include<cstdio>
char P[80];
int main() {
	int t;
	scanf("%d ", &t);
	while (t--) {
		int Score = 0, Answer = 0;
		scanf("%s ", P);
		int i = 0;
		while (P[i]) {
			if (P[i] == 'O') {
				Score++;
				Answer += Score;
			}
			if (P[i] == 'X') Score = 0;
			i++;
		}
		printf("%d\n", Answer);
	}
	return 0;
}

평균은 넘겠지(4344)

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
입력

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

출력

40.000%
57.143%
33.333%
66.667%
55.556%
#include<cstdio>
int a[1000];
int main() {
	int c, n, cnt;
	double avg;
	scanf("%d", &c);
	while (c--) {
		cnt = 0, avg = 0;
		scanf("%d", &n);
		for (int i = 0; i < n; i++) {
			scanf("%d", &a[i]);
			avg += a[i];
		}
		avg = (double)avg / n;
		for (int i = 0; i < n; i++)
			if (a[i] > avg)cnt++;
		printf("%.3lf%%\n", (double)cnt / n * 100);
	}
	return 0;
}

댓글남기기