반응형

문제

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

출력

첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

 

풀이

- data 입력 받기 : N 숫자 개수 

- 먼저 입력된 값을 정렬 한다.그래야 중앙값, 범위를 간단히 계산 해 낼 수 있다. 

- 산술평균, 중앙값,범위는 정렬후 간단히 계산이 가능한데, 중앙값은 좀 더 작업이 필요하다. 

-

/*baekjoon 2108 통계학*/
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

#define MAXN  ((int)5e5)

int	N;
int Data[MAXN+10]; 
struct MaxData{
	int cnt,val;
};
int A[MAXN+10];
MaxData C[8000+10];
void OutputData(){
	cout << "Frequency : " << endl;
    for(int i = 0; i < 8010; i++){
		if( C[i].cnt >0){
    		cout << C[i].cnt << " " << C[i].val << endl;
		}
    }
}
void InputData(){
    cin >> N;
    for(int i = 0; i < N; i++){
    	cin >> Data[i];
    }
}
bool comp(struct MaxData a, struct MaxData b)
{ 
	if( a.cnt == b.cnt ){
		return a.val < b.val;
	}else{
		return a.cnt > b.cnt;
	}
}
int SortSecond(){
	int maxvalue=0, j=0;
	for(int i=0; i< 8010; i++){
		if(A[i] >0 ){
			if(i<=4000){
				C[j].val=i;
			}
			else{
				C[j].val=4000-i;
			}
			C[j].cnt=A[i];
			j++;
		}
	}
	sort(C, C+8010,comp);
	if(C[0].cnt == C[1].cnt){
		maxvalue= C[1].val;
	}else{
		maxvalue=C[0].val;
	}

	return maxvalue ;
}
void Solve()
{
	double sum=0;
	sort(Data, Data+N);
    for( int i=0; i<N; i++){
		sum += Data[i];
		if( Data[i] >=0){
			A[Data[i]]++;
		} else{
			A[4000-Data[i]]++;
		}
    }
	cout << round(sum/N) << endl;
	cout << Data[N/2] << endl;
	cout << SortSecond() << endl;
	cout << abs(Data[0] - Data[N-1]) << endl;
}
int main()
{
	InputData();
	Solve();
	return 0;
}
/*baekjoon 2108 통계학*/
반응형
반응형

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

풀이

 

 

/*baekjoon 11651 좌표 정렬하기*/
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 100001

struct ST{
	int x, y;
};

int	N;
struct ST XYdata[MAX];

void InputData(){
	//input data size
    scanf("%d", &N);
	//input data
    for( int i=0; i<N; i++ ){
    scanf("%d %d", &XYdata[i].x, &XYdata[i].y );
    }
}

void OutputData(){
	for( int i=0; i<N; i++){
		printf("%d %d", XYdata[i].x, XYdata[i].y);
	printf("\n");
	}
}

bool comp(struct ST i, struct ST j){ 
	if (i.y < j.y) 
		return true;
	else if (i.y == j.y)
		return (i.x < j.x); 
	else 
		return false;
}

int main()
{
	InputData();
	sort( XYdata, XYdata+N, comp );
	OutputData();

	return 0;
}
/*baekjoon 11651 좌표 정렬하기*/
반응형
반응형

문제

배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

입력

첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.

 

 

풀이 

- sort를 이용한 단순 정렬 문제 

 

  1 /*baekjoon 1427 소트인사이드*/
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <string>
  5 using namespace std;
  6 
  7 string N;
  8 void InputData(){
  9     cin >> N;
 10 }
 11 bool comp(string a, string b){ return a < b;}
 12 void Solve(){
 13     sort(N.rbegin(),N.rend());
 14     cout << N << endl;
 15 }
 16 int main(){
 17     InputData();
 18     Solve();
 19     return 0;
 20 }
 21 /*baekjoon 1427 소트인사이드*/   
반응형
반응형

문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

 

입력

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

출력

조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

 

 

풀이

 

-sort를 이용한 단순 정렬 문제

-strcmp대신 c++에서 사용하는 str[i].compare(str[i+1])를 사용함 

 

/*baekjoon 1181 단어 정렬*/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

#define MAX 20000
int	N;
string Data[MAX+10];

void InputData(){
	cin >> N;
	for(int i = 0; i < N; i++){
		cin >> Data[i];
	}
}
void OutputData(){
	for( int i=0; i<N; i++){
		cout << Data[i]<< endl;
	}
}
bool comp(string i, string j){ 
    if (i.size() == j.size()){
        return (i < j);
    }
    else{
        return i.size() < j.size();
    }
}
void Solve(){
	cout << Data[0] << endl;	
	for(int i=0; i<N-1; i++){
		if(Data[i].compare(Data[i+1]) ){
			cout << Data[i+1] << endl;	
		}
	}
}
int main()
{
	InputData();
	sort( Data, Data+N, comp);
	Solve();
	return 0;
}
/*baekjoon 1181 단어 정렬*/
반응형
반응형

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

 

/*baekjoon 10989  수 정렬하기 3*/
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 10001

int	N;
int NumData[MAX] = {0}; 

void InputData(){
	int tmp=0;
	//input data size
	cin >> N;
	//input data
	for(int i = 0; i < N; i++){
        scanf("%d", &tmp);
		NumData[tmp]++;
	}
}

void OutputData(){
	for( int i=0; i<MAX; i++){
		if(NumData[i]){
			for(int count=0; count<NumData[i]; count++)
				printf("%d\n", i);
		}
	}
}

int main()
{
	InputData();
	OutputData();

	return 0;
}
/*baekjoon 10989  수 정렬하기 3*/
반응형
반응형

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

문제

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

 

 

/*baekjoon 10814 나이순 정렬*/
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 100001

struct ST{
	int age;
	char name[110];
};

int	N;
struct ST PersonData[MAX];

void InputData(){
	//input data size
	cin >> N;
	//input data
	for(int i = 0; i < N; i++){
		cin >> PersonData[i].age >> PersonData[i].name;
	}
}

void OutputData(){
	for( int i=0; i<N; i++){
		printf("%d %s", PersonData[i].age, PersonData[i].name);
	printf("\n");
	}
}

bool Comp_age(struct ST i, struct ST j){ return (i.age < j.age);}
bool Comp_name(struct ST i, struct ST j){ return (i.name < j.name);}

int main()
{
	InputData();
	stable_sort( PersonData, PersonData+N, Comp_age);
	OutputData();

	return 0;
}
/*baekjoon 10814 나이순 정렬*/
반응형
반응형

www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

 

2750문제에서 array size만 1000000로 변경하였다. 

 

/*baekjoon 2751 수 정렬하기2 */
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX 1000001

int main()
{
	int data[MAX];
	int i,j, N;
	int tmp, exchg;

	vector<int> v;

	//input data size
	cin >> N;

	//input data
	for(i=0; i<N; i++) {
		cin >> data[i];
		v.push_back(data[i]);
	}

	sort(v.begin(), v.end());
	for(vector<int>::iterator it=v.begin(); it<v.end(); it++)
		printf("%d\n", *it );
		
	return 0;
}
/*baekjoon 2751 수 정렬하기2 */
반응형
반응형

www.acmicpc.net/problem/2750

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

풀이 방법 : 

-입력 받고 

-단순 sorting함수 이용해서 풀면 되는 간단한 문제 

/*baekjoon 2750 수 정렬하기*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX 1001

int main()
{
	int data[MAX];
	int i,j, N;
	int tmp, exchg;

	vector<int> v;

	//input data size
	cin >> N;

	//input data
	for(i=0; i<N; i++) {
		cin >> data[i];
		v.push_back(data[i]);
	}

	sort(v.begin(), v.end());
	for(vector<int>::iterator it=v.begin(); it<v.end(); it++)
		printf("%d\n", *it );
		
	return 0;
}
/*baekjoon 2750 수 정렬하기*/

이제 좀 코딩 연습을 하고 나서 다시 작성한 내용입니다. 

2021.6.26

  1 /*baekjoon 2750 수 정렬하기*/
  2 #include <iostream>
  3 #include <algorithm>
  4 using namespace std;
  5 #define MAXN 1001
  6 
  7 int N;
  8 int Data[MAXN+10];
  9 
 10 void InputData(){
 11     cin >> N;
 12     for(int i=0; i<N; i++){
 13         cin >> Data[i];
 14     }
 15 }
 16 void Solve(){
 17     for(int i=0; i<N; i++){
 18         cout << Data[i] << endl;
 19     }
 20 }
 21 int main()
 22 {
 23     InputData();
 24     sort(Data, Data+N);
 25     Solve();
 26     return 0;                                                                          
 27 }   
 28 /*baekjoon 2750 수 정렬하기*/
반응형

+ Recent posts