관리 메뉴

History

[C언어] 중복 값 없는 max 데이터 찾기 본문

C,C++/개념 실습 프로그래밍

[C언어] 중복 값 없는 max 데이터 찾기

luckybee 2023. 4. 9. 02:09
728x90
반응형

이번 게시글은 배열 안에 있는 정수 값을 상위 10개를 중복 없이 출력하기 위한 코드를 소개한다.

 

보통 문제를 풀다 보면 10개의 배열에 랜덤으로 값이 들어가 있고, max값과 min값을 출력하라 라는 문제가 많이 보인다. max값과 min값을 출력하는 코드는 간단하다. 구현은 아래 소스를 보자.

#include<stdio.h>
#include<stdlib.h>  //srand를 쓰기 위해
#include<time.h>  //time을 쓰기위해


int main()
{
	srand((unsigned int)time(NULL));
	int arr[20] = {};    // 랜덤으로 값을 넣을 배열
	int max=0;    
	int min=10001;    
	
	for (int i = 0; i < 20; i++) {
		arr[i] = rand() % 10000 + 1;  //1~10000까지의 숫자를 랜덤하게 대입
	}

	for (int i = 0; i < 20; i++) {
		printf("arr[%d]의 배열의 값: %d\n", i, arr[i]);   //확인 출력
	}
	printf("\n");   
	for (int i = 0; i < 20; i++) {   
		if (max<arr[i]){   //최댓값을 구하기 위한 if
			max = arr[i];
		}
		if (min > arr[i]) { //최솟값을 구하기 위한 if
			min = arr[i];
		}
	}
	
	printf("arr의 max값: %d\narr의 min값: %d\n", max, min);   //확인 출력
	return 0;
}

여기까지는 배열과 조건문을 조금만 응용을 하면 쉽게 할 수 있다. 여기서 좀 만 더 응용하면 3번째 max 값을 구하라고 할 수 있다. 보통 이렇게 문제가 나오면 정렬을 해서 3번째 값을 출력한다. 아래 코드를 보자.

#include<stdio.h>
#include<stdlib.h>  //srand를 쓰기 위해
#include<time.h>  //time을 쓰기위해


int main()
{
	srand((unsigned int)time(NULL));
	int arr[20] = {};    // 랜덤으로 값을 넣을 배열
	int max=0,temp;    
	
	for (int i = 0; i < 20; i++) {
		arr[i] = rand() % 10000 + 1;  //1~10000까지의 숫자를 랜덤하게 대입
	}

	for (int i = 0; i < 20; i++) {
		printf("arr[%d]의 배열의 값: %d\n", i, arr[i]);   //확인 출력
	}
	printf("\n");   
	for (int i = 0; i < 20; i++) {   
		for (int j = i+1; j < 20; j++) {
			if (arr[i]< arr[j]){
				temp = arr[i];
				arr[i]= arr[j];
				arr[j] = temp;
			}
		}
	}
	for (int i = 0; i < 20; i++) {
		printf("arr[%d]의 배열의 값: %d\n", i, arr[i]);   //확인 출력
	}
	printf("\n");
	printf("arr의 3번째 max값: %d\n", arr[2]);   //확인 출력
	return 0;
}

아래는 실행 결과이다.

arr[0]의 배열의 값: 2948
arr[1]의 배열의 값: 5646
arr[2]의 배열의 값: 7010
arr[3]의 배열의 값: 7391
arr[4]의 배열의 값: 8527
arr[5]의 배열의 값: 342
arr[6]의 배열의 값: 938
arr[7]의 배열의 값: 5669
arr[8]의 배열의 값: 7777
arr[9]의 배열의 값: 8600
arr[10]의 배열의 값: 2476
arr[11]의 배열의 값: 8834
arr[12]의 배열의 값: 492
arr[13]의 배열의 값: 557
arr[14]의 배열의 값: 6097
arr[15]의 배열의 값: 1197
arr[16]의 배열의 값: 5247
arr[17]의 배열의 값: 212
arr[18]의 배열의 값: 1464
arr[19]의 배열의 값: 3013

arr[0]의 배열의 값: 8834
arr[1]의 배열의 값: 8600
arr[2]의 배열의 값: 8527
arr[3]의 배열의 값: 7777
arr[4]의 배열의 값: 7391
arr[5]의 배열의 값: 7010
arr[6]의 배열의 값: 6097
arr[7]의 배열의 값: 5669
arr[8]의 배열의 값: 5646
arr[9]의 배열의 값: 5247
arr[10]의 배열의 값: 3013
arr[11]의 배열의 값: 2948
arr[12]의 배열의 값: 2476
arr[13]의 배열의 값: 1464
arr[14]의 배열의 값: 1197
arr[15]의 배열의 값: 938
arr[16]의 배열의 값: 557
arr[17]의 배열의 값: 492
arr[18]의 배열의 값: 342
arr[19]의 배열의 값: 212

arr의 3번째 max값: 8527

그럼 중복없이 10개의 상위 데이터를 출력하라고 하면 방금처럼 정렬을 이용해서 출력할 수 있지만, 프로그래밍을 하다 보면 보통 정렬을 사용하여 중복값없는 값을 출력하지는 않는다. 아래 코드를 보자.

 

#include<stdio.h>
#include<stdlib.h>  //srand를 쓰기 위해
#include<time.h>  //time을 쓰기위해


int main()
{
	srand((unsigned int)time(NULL));
	int arr[20] = {};    // 랜덤으로 값을 넣을 배열
	int max[10] = {};    // 상위 10개의 데이터를 뽑을 것이다. 
	int temp_j[10] = {}; // arr에 있는 상위 10개의 데이터의 인덱스를 넣을 배열

	for (int i = 0; i < 20; i++) {
		arr[i] = rand() % 10000 + 1;  //1~10000까지의 숫자를 랜덤하게 대입
	}

	for (int i = 0; i < 20; i++) {
		printf("arr[%d]의 배열의 값: %d\n", i, arr[i]);   //확인 출력
	}
	printf("\n");   
	for (int i = 0; i < 10; i++) {   //상위 10개만 찾을 것이기 때문에 10번만 반복문을 돌린다.
		for (int j = 0; j < 20; j++) {    //20개의 데이터 값을 0번째부터 최댓값을 찾기 위해 반복한다. 
			if (max[i] < arr[j]) {   //max값을 찾기 위한 조건문
				max[i] = arr[j];    //max값일 때마다 대입
				temp_j[i] = j;     //인덱스도 같이 대입
			}
		}
		arr[temp_j[i]] = 0;   //max인덱스가 있던 값을 0으로 대입 0으로 대입을 안하면 같은 max 값만 나오기 때문
	}
	for (int i = 0; i < 20; i++) {
		printf("arr의 배열 %d번째의 값: %d\n", i, arr[i]);   //확인 출력
	}
	printf("\n");
	for (int i = 0; i < 10; i++) {
		printf("%d번째 max:%d, j번째:%d\n", i, max[i], temp_j[i]);   //결과 출력
	}
	return 0;
}

 아래는 실행 결과이다.

arr[0]의 배열의 값: 4029
arr[1]의 배열의 값: 1657
arr[2]의 배열의 값: 1810
arr[3]의 배열의 값: 9724
arr[4]의 배열의 값: 2011
arr[5]의 배열의 값: 9370
arr[6]의 배열의 값: 2583
arr[7]의 배열의 값: 7013
arr[8]의 배열의 값: 857
arr[9]의 배열의 값: 5206
arr[10]의 배열의 값: 9055
arr[11]의 배열의 값: 646
arr[12]의 배열의 값: 1195
arr[13]의 배열의 값: 5135
arr[14]의 배열의 값: 1671
arr[15]의 배열의 값: 5705
arr[16]의 배열의 값: 1875
arr[17]의 배열의 값: 4113
arr[18]의 배열의 값: 4840
arr[19]의 배열의 값: 895

arr의 배열 0번째의 값: 0
arr의 배열 1번째의 값: 1657
arr의 배열 2번째의 값: 1810
arr의 배열 3번째의 값: 0
arr의 배열 4번째의 값: 2011
arr의 배열 5번째의 값: 0
arr의 배열 6번째의 값: 2583
arr의 배열 7번째의 값: 0
arr의 배열 8번째의 값: 857
arr의 배열 9번째의 값: 0
arr의 배열 10번째의 값: 0
arr의 배열 11번째의 값: 646
arr의 배열 12번째의 값: 1195
arr의 배열 13번째의 값: 0
arr의 배열 14번째의 값: 1671
arr의 배열 15번째의 값: 0
arr의 배열 16번째의 값: 1875
arr의 배열 17번째의 값: 0
arr의 배열 18번째의 값: 0
arr의 배열 19번째의 값: 895

0번째 max:9724, j번째:3
1번째 max:9370, j번째:5
2번째 max:9055, j번째:10
3번째 max:7013, j번째:7
4번째 max:5705, j번째:15
5번째 max:5206, j번째:9
6번째 max:5135, j번째:13
7번째 max:4840, j번째:18
8번째 max:4113, j번째:17
9번째 max:4029, j번째:0

위의 코드처럼 깔끔하게 10개의 상위 데이터를 중복없이 저장하여 출력했다. 

 

코드는 정답이 없다. 자신이 만든게 결과가 똑같이 나왔다면 자신의 방법으로 해도 무방하다. 

728x90
반응형
Comments