Do it 자료구조와 함께 배우는 알고리즘 입문(C언어편) => c++로 풀기
연습문제
Q1) 최솟값 구하기
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstdlib>
using namespace std;
int minof(const int a[], int n){
int i;
int min = a[0];
for(i=1;i<n;i++){
if(a[i]<min)
min=a[i];
}
return min;
}
int main(void){
int *ap; //배열 a의 첫번째 요소의 포인터
int cnt_a; //배열 a의 요소 개수
puts("요소 개수 : ");
cin>>cnt_a;
ap = (int *)calloc(cnt_a, sizeof(int));// 요소의 개수가 cnt_a인 int 형 배열을 생성
cout << cnt_a <<"개의 정수를 입력하세요"<<endl;
for(int i=0;i<cnt_a;i++){
cout <<"ap["<<i<<"] : ";
cin>>ap[i];
}
cout<<"최솟값은 "<< minof(ap,cnt_a) <<"입니다.";
free(ap);
return 0;
}
Q2) 총 합 구하기
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstdlib>
using namespace std;
int sumof(const int a[], int n){
int i;
int sum=0;
for(i=0;i<n;i++){
sum+=a[i];
}
return sum;
}
int main(void){
int *ap; //배열 a의 첫번째 요소의 포인터
int cnt_a; //배열 a의 요소 개수
puts("요소 개수 : ");
cin>>cnt_a;
ap = (int *)calloc(cnt_a, sizeof(int));// 요소의 개수가 cnt_a인 int 형 배열을 생성
cout << cnt_a <<"개의 정수를 입력하세요"<<endl;
for(int i=0;i<cnt_a;i++){
cout <<"ap["<<i<<"] : ";
cin>>ap[i];
}
cout<<"총 합은 "<< sumof(ap,cnt_a) <<"입니다."<<endl;
free(ap);
return 0;
}
Q3) 키의 평균 구하기
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstdlib>
using namespace std;
double avgof(const int a[], int n){
int i;
double sum=0;
for(i=0;i<n;i++){
sum+=a[i];
}
return sum/n;
}
int main(void){
int *height; //배열 a의 첫번째 요소의 포인터
int cnt_p; //배열 a의 요소 개수
puts("사람 수 : ");
cin>>cnt_p;
height = (int *)calloc(cnt_p, sizeof(int));// 요소의 개수가 cnt_a인 int 형 배열을 생성
cout << cnt_p <<" 사람의 키를 입력하세요. "<<endl;
for(int i=0;i<cnt_p;i++){
cout <<"height["<<i<<"] : ";
cin>>height[i];
}
cout<<"키의 평균은 "<< avgof(height,cnt_p) <<"입니다."<<endl;
free(height);
return 0;
}
Q4) 키와 함께 사람 수를 난수로 생성하여 키의 최댓값을 구하라(2-6 참고)
사람수는 5이상 20이하
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstdlib>
#include <ctime>
using namespace std;
int maxof(const int a[], int n){
int i;
int max = a[0];
for(i= 1;i<n;i++){
if(a[i]>max) max=a[i];
}
return max;
}
int main(void){
int *height; //배열 a의 첫번째 요소의 포인터
int cnt_p; //배열 a의 요소 개수
srand((unsigned)time(NULL)); // seed 초기화 // unsigned로 error 해결
cnt_p = 5 + rand()%16; // 사람 수 랜덤 5이상 20이하
puts("사람 수 : ");
cout <<cnt_p<<endl;
height = (int *)calloc(cnt_p, sizeof(int));// 요소의 개수가 cnt_a인 int 형 배열을 생성
for(int i=0;i<cnt_p;i++){
height[i]=100 + rand()%90;
cout <<"height["<<i<<"] = "<<height[i]<<"입니다."<<endl;
}
cout<<"키의 최댓값은 "<< maxof(height,cnt_p) <<"입니다."<<endl;
free(height);
return 0;
}
return 확인 좀 하자
Q5) 배열 요소를 역순으로 정렬하는 과정을 일일이 출력하라
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstdlib>
#include <ctime>
using namespace std;
#define swap(type, x,y) do{type t=x;x=y;y=t;} while(0)
void num_print(const int a[], int n){
int i;
for(i=0;i<n;i++){
cout << a[i]<<" ";
}
cout <<endl;
}
void num_reverse(int a[], int n){
int i;
for(i=0;i<n/2;i++){ // 역순으로 정렬(요소 개수가 n인 배열 a의 요소를 역순으로 정렬
num_print(a,n);
cout<<"a["<<i<<"]과 a["<<n-i-1<<"]를 교환합니다."<<endl;
swap(int, a[i], a[n-i-1]);
}
num_print(a, n);
puts("역순 정렬이 끝남.");
}
int main(void){
int i;
int *x;
int nx;
cout <<"요소 개수 : ";
cin>>nx;
x=(int *)calloc(nx, sizeof(int)); // 요소 개수가 nx인 int형 배열 x를 생성
cout<<nx<<"개의 정수를 입력하라"<<endl;
for(i=0;i<nx;i++){
cin>> x[i];
}
num_reverse(x, nx); // 배열 x 역순 정렬
free(x);
return 0;
}
Q6) 배열의 맨 앞쪽에 윗자리를 저장하는 card_conv func를 작성하라
#include <iostream>
#include <cstdio>
using namespace std;
#define swap(type, x, y) do {type t = x; x = y; y = t;} while (0)
// 정수 값 x를 n진수로 변환하여 배열 d에 아랫자리부터 저장
int card_convr(unsigned x, int n, char d[]){
char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int digits = 0;//변환 후 자릿수
if(x==0){
d[digits++] =dchar[0];//변환 후에도 0
}
else{
while(x){
d[digits++] = dchar[x%n]; //n으로 나눈 나머지 저장
x/=n;
}
}
// 윗자리를 저장할 경우 -> 역순 정렬하기
for(int i=0;i<digits/2;i++){
swap(char, d[i], d[digits-i-1]);
}
return digits;
}
int main(void){
int i;
unsigned num;// 변환하는 정수;
int cardinal_n; // 기수
int dcnt; // 변환 후 자릿수
char cardinal_num[512];// 변환한 값의 각 자리 숫자를 저장하는 문자 배열
int retry;// 한번 더
puts("10진수를 기수 변환한다. ");
do{
puts("변환하는 음이 아닌 정수 : ");
cin>> num;
do{
puts("어떤 진수로 변환할까요?(2-36) : ");
cin>>cardinal_n;
}while(cardinal_n<2||cardinal_n>36);
dcnt = card_convr(num, cardinal_n,cardinal_num);
cout <<cardinal_n<<"진수로는 ";
for(i=dcnt-1;i>=0;i--){ // dnltwkfl qnxj ckfPfh cnffur
cout <<cardinal_num[i];
}
puts("입니다.");
cout<<"한번 더 할까요?(1=예/0=아니요) : ";
cin>>retry;
}while(retry==1); // 다시 do ~ while 문 돈다
return 0;
}
Q7) Q6의 기수 변환 과정 상세하게 출력하라
#include <iostream>
#include <cstdio>
using namespace std;
#define swap(type, x, y) do {type t = x; x = y; y = t;} while (0)
// 정수 값 x를 n진수로 변환하여 배열 d에 아랫자리부터 저장
int card_convr(unsigned x, int n, char d[]){
char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int digits = 0;//변환 후 자릿수
if(x==0){
d[digits++] =dchar[0];//변환 후에도 0
}
else{
while(x){
cout << n<<" | "<<x << " ... "<<dchar[x%n]<<endl;
cout <<" + ----"<<endl;
d[digits++] = dchar[x%n]; //n으로 나눈 나머지 저장
x/=n;
}
cout <<" "<<x<<endl;
}
// 윗자리를 저장할 경우 -> 역순 정렬하기
for(int i=0;i<digits/2;i++){
swap(char, d[i], d[digits-i-1]);
}
return digits;
}
int main(void){
int i;
unsigned num;// 변환하는 정수;
int cardinal_n; // 기수
int dcnt; // 변환 후 자릿수
char cardinal_num[512];// 변환한 값의 각 자리 숫자를 저장하는 문자 배열
int retry;// 한번 더
puts("10진수를 기수 변환한다. ");
do{
puts("변환하는 음이 아닌 정수 : ");
cin>> num;
do{
puts("어떤 진수로 변환할까요?(2-36) : ");
cin>>cardinal_n;
}while(cardinal_n<2||cardinal_n>36);
dcnt = card_convr(num, cardinal_n,cardinal_num);
cout <<cardinal_n<<"진수로는 ";
for(i=dcnt-1;i>=0;i--){ // dnltwkfl qnxj ckfPfh cnffur
cout <<cardinal_num[i];
}
puts("입니다.");
cout<<"한번 더 할까요?(1=예/0=아니요) : ";
cin>>retry;
}while(retry==1); // 다시 do ~ while 문 돈다
return 0;
}
Q8) 배열 b의 모든 요소를 배열 a에 복사하는 함수를 작성하라(n은 요소 개수)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
void arr_copy(int a[], const int b[], int n){
int i;
for(i=0;i<n;i++)
a[i]=b[i];
}
int main(void){
int i;
int *a_arr, *b_arr;
int n;
cout <<"요소 개수 : ";
cin>>n;
a_arr = (int *)calloc(n, sizeof(int)); // n개인 배열 a_arr 생성
b_arr = (int *)calloc(n, sizeof(int));
cout <<n<<"개의 정수를 입력하시오."<<endl;
for(i=0;i<n;i++){
cout<<"a_arr["<<i<<"] : ";
cin>> a_arr[i];
}
arr_copy(b_arr, a_arr, n); //a_arr 배열 요소를 b_arr로 복사
cout <<"복사 완료"<<endl;
cout << "b_arr 배열의 요소들 : "<<endl;
for(i=0;i<n;i++){
cout << b_arr[i]<< " ";
}
cout <<endl;
free(a_arr);
free(b_arr);
return 0;
}
Q9) Q8 에서 역순으로 배열 a에 복사하는 함수를 작성하라(n은 요소 개수)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
void arr_reverse_copy(int a[], const int b[], int n){
int i;
for(i=0;i<n;i++)
a[i]=b[n-i-1];
}
int main(void){
int i;
int *a_arr, *b_arr;
int n;
cout <<"요소 개수 : ";
cin>>n;
a_arr = (int *)calloc(n, sizeof(int)); // n개인 배열 a_arr 생성
b_arr = (int *)calloc(n, sizeof(int));
cout <<n<<"개의 정수를 입력하시오."<<endl;
for(i=0;i<n;i++){
cout<<"a_arr["<<i<<"] : ";
cin>> a_arr[i];
}
arr_reverse_copy(b_arr, a_arr, n); //a_arr 배열 요소를 b_arr로 복사
cout <<"복사 완료"<<endl;
cout << "b_arr 배열의 요소들 : "<<endl;
for(i=0;i<n;i++){
cout << b_arr[i]<< " ";
}
cout <<endl;
free(a_arr);
free(b_arr);
return 0;
}
Q10) 배열 a_arr 의 순서를 shuffle하여 출력하라
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
#define swap(type, x, y) do {type t = x; x = y; y = t;} while (0)
void arr_shuffle(int a[], int n){
int i;
srand((unsigned)time(NULL));
for(i=n-1;i>0;i--){
int j=rand()%(i+1); // 랜덤 배열 위치
if(i!=j)
swap(int, a[i], a[j]);
}
}
int main(void){
int i;
int *a_arr;
int n;
cout <<"요소 개수 : ";
cin>>n;
a_arr = (int *)calloc(n, sizeof(int)); // n개인 배열 a_arr 생성
cout <<n<<"개의 정수를 입력하시오."<<endl;
for(i=0;i<n;i++){
cout<<"a_arr["<<i<<"] : ";
cin>> a_arr[i];
}
arr_shuffle(a_arr, n); //a_arr 배열 요소를 b_arr로 복사
cout <<"shuffle"<<endl;
cout << "suffle된 a_arr 배열 : "<<endl;
for(i=0;i<n;i++){
cout << a_arr[i]<< " ";
}
cout <<endl;
free(a_arr);
return 0;
}
'코딩 > C++' 카테고리의 다른 글
| C++ 알고리즘 연습문제 - 구조체 (0) | 2022.03.23 |
|---|---|
| C++ 알고리즘 연습문제 - 함수사용, 윤년계산 (0) | 2022.03.23 |
| C++ - 배열 요소 (calloc 사용) (0) | 2022.03.20 |
| 백준 문제풀이 C++ [220303] - 브루트 포스, pair<type, type> (0) | 2022.03.03 |
| 백준 문제풀이 C++ [220226] - 정렬 (0) | 2022.02.26 |