#작성 코드

#include <iostream>
#include <vector>
using namespace std;

int N, M;
bool visit[9];
int cnt;
vector<int> v;

void dfs(int cnt){
	if( cnt == M ){
		for(int i=0; i<v.size(); i++){
			cout<<v[i]<<' ';
		}
		cout<<'\n';
		return;
	}
	
	for(int i=1; i<=N; i++){
		// 앞서 방문했던 숫자는 방문x 
		if( visit[i] == true ){
			continue;
		}
		visit[i] = true;
		v.push_back(i);
		dfs(cnt+1);		//재귀함수로 구현한 DFS. i로 시작하는 이하 dfs 수행한다. 
		visit[i] = false;
		v.pop_back();
	}
}
int main(){
	cin>>N>>M;
	// 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 모두 출력.
	dfs(0);
	return 0;
}

##

순열을 구현할 아이디어를 검색을 통해 얻었다.

순열은 조합과 달리 {1, 2}와 {2, 1}을 다른 것으로 취급한다.

'BOJ' 카테고리의 다른 글

BOJ 15651번 :: N과 M(3)  (0) 2019.11.25
BOJ 15650번 :: N과 M(2)  (0) 2019.11.24
BOJ 10814번 :: 나이순 정렬  (0) 2019.11.24
BOJ 11651번 :: 좌표 정렬하기2  (0) 2019.11.24
BOJ 11650번 :: 좌표 정렬하기  (0) 2019.11.24

#작성 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool comp( pair<int, string> a, pair<int, string> b){
	return a.first<b.first;
}
int main(){
	int N;
	vector< pair<int,string> > v;
	cin>>N;
	for(int i=0; i<N; i++){
		int age;
		string name;
		cin>>age>>name;
		v.push_back( pair<int,string>(age, name) );
	}
	
	stable_sort(v.begin(), v.end(), comp);
	for(vector< pair<int,string> >::iterator i=v.begin(); i<v.end(); i++){
		cout<<i->first<<' '<<i->second<<'\n';
	}
	return 0;
}

##

나이가 같을 경우 기존의 순서 그대로 유지하기 위해서는 sort함수 대신 stable_sort함수를 사용해야 한다.

'BOJ' 카테고리의 다른 글

BOJ 15650번 :: N과 M(2)  (0) 2019.11.24
BOJ 15649번 :: N과 M(1)  (0) 2019.11.24
BOJ 11651번 :: 좌표 정렬하기2  (0) 2019.11.24
BOJ 11650번 :: 좌표 정렬하기  (0) 2019.11.24
BOJ 1427번 :: 소트인사이드  (0) 2019.11.23

#작성 코드

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
bool comp( pair<int, int> a, pair<int, int> b){
	if( a.second == b.second ){
		return a.first < b.first;
	}
	return a.second<b.second;
}

int main(){
	vector< pair<int, int> > v;
	int N;
	scanf("%d", &N);
	for(int i=0; i<N; i++){
		int x, y;
		scanf("%d %d", &x, &y);
		v.push_back(pair<int, int>(x, y));
	}
	
	sort(v.begin(), v.end(), comp);
	for(vector< pair<int, int> >::iterator i=v.begin(); i<v.end(); i++){
		printf("%d %d\n", i->first, i->second);
	}
	return 0;
}

##

11650번과 정렬 기준이 되는 comp함수의 내용만 살짝 다르다.

'BOJ' 카테고리의 다른 글

BOJ 15649번 :: N과 M(1)  (0) 2019.11.24
BOJ 10814번 :: 나이순 정렬  (0) 2019.11.24
BOJ 11650번 :: 좌표 정렬하기  (0) 2019.11.24
BOJ 1427번 :: 소트인사이드  (0) 2019.11.23
BOJ 2108번 :: 통계학  (0) 2019.11.23

#작성 코드

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
bool comp( pair<int, int> a, pair<int, int> b){
	if( a.first == b.first ){
		return a.second < b.second;
	}
	return a.first<b.first;
}

int main(){
	vector< pair<int, int> > v;
	int N;
	scanf("%d", &N);
	for(int i=0; i<N; i++){
		int x, y;
		scanf("%d %d", &x, &y);
		v.push_back(pair<int, int>(x, y));
	}
	
	sort(v.begin(), v.end(), comp);
	for(vector< pair<int, int> >::iterator i=v.begin(); i<v.end(); i++){
		printf("%d %d\n", i->first, i->second);
	}
	return 0;
}

##

vector iterator의 사용!

vector < pair<int, int> >::iterator i = v.begin()

i는 벡터 v의 시작 벡터를 가리키는 포인터처럼 동작. => i->first, i->second 처럼 각 벡터의 pair에 접근해야한다.

'BOJ' 카테고리의 다른 글

BOJ 10814번 :: 나이순 정렬  (0) 2019.11.24
BOJ 11651번 :: 좌표 정렬하기2  (0) 2019.11.24
BOJ 1427번 :: 소트인사이드  (0) 2019.11.23
BOJ 2108번 :: 통계학  (0) 2019.11.23
BOJ 1436번 :: 영화감독 숌  (0) 2019.11.23

#작성 코드

#include <iostream>
#include <cstdio>
#include <algorithm>

long long int num;
int digit[10];

bool comp(int a, int b){
	return a>b;
}
int main(){
	scanf("%lld", &num);
	if( num > 1000000000 ) return 0;
	// 입력받은 수의 자리수를 계산. 
	int t=1, digits=1;
	while( num >= t ){
		t*=10;
		digits++;	
	}
	// 각 자리수를 digit배열에 하나씩 저장. 
	for(int i=0; i<10; i++){
		int tmp = num%10;
		digit[i] = tmp;
		num/=10;
	}
	// digit배열의 내용을 내림차순으로 정렬. 
	std::sort(digit, digit+10, comp);
	// 자리수만큼 digit배열의 내용을 출력한다. 
	for(int i=0; i<digits-1; i++){
		printf("%d", digit[i]);
	}
	return 0;
}

##

'BOJ' 카테고리의 다른 글

BOJ 11651번 :: 좌표 정렬하기2  (0) 2019.11.24
BOJ 11650번 :: 좌표 정렬하기  (0) 2019.11.24
BOJ 2108번 :: 통계학  (0) 2019.11.23
BOJ 1436번 :: 영화감독 숌  (0) 2019.11.23
BOJ 1018번 :: 체스판 다시 칠하기  (0) 2019.11.21

#작성 코드

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int N;
int arr[500000];

bool comp(pair<int, int> a, pair<int, int> b){
	if( a.second == b.second ){
		return a.first < b.first;
	}
	else
		return a.second>b.second;
}

int findmaxcount(int *arr, int N){
	vector< pair<int, int> > count;		// 값, 빈도 저장할 배열 0으로 초기화 
	for(int i=0; i<N; i++){
		if(count.empty()){
			count.push_back(pair<int, int>(arr[i], 1));
			continue;	
		}
		if(count.back().first == arr[i]){		// arr이 순서대로 정렬되어있으므로 가능하다. 
			pair<int, int> tmp = count.back();
			tmp.second++;
			count.pop_back();
			count.push_back(tmp);
		}
		else{
			count.push_back(pair<int, int>(arr[i], 1));
		}
	}
	// '1순위 : 빈도, 2순위 : 값 작은 순서'로 정렬
	sort(count.begin(), count.end(), comp );
	
	if( count[0].second == count[1].second){
		return count[1].first;	// 빈도수 같으면 값 더 큰것 
	}
	else{
		return count[0].first;	// 빈도수 더 큰것. 
	}
}
int main(){
	scanf("%d", &N);
	double sum=0;
	for(int i=0; i<N; i++){
		scanf("%d", &arr[i]);
		sum+=arr[i];
	}
	sort(arr, arr+N);		// arr 배열을 오름차순으로 정렬 
	
	int maxcount = findmaxcount(arr, N);
	printf("%d\n", (int)floor(sum/N+0.5));	// 산술평균 출력(소수점이하 첫째자리에서 반올림) 
	printf("%d\n", arr[N/2]);			// 중앙값 출력
	printf("%d\n", maxcount);			// 최빈값 출력
	printf("%d\n", arr[N-1]-arr[0]);	// 범위 출력 
	return 0; 
} 

##

최빈값을 구할 때, 2차원 count배열을 만들어서 [값][0]에 값을 저장하고, [값][1]에 빈도수를 저장하려고 했지만 음수 값 케이스를 생각하지 못했다. 음수는 배열의 인덱스로 사용할 수 없기 때문에  => vector와 pair를 사용해서 (값, 빈도수)를 저장했다.

의외로 산술평균을 출력하는 곳에서 오류가 발생했다.

처음 시도한 코드는 (int)( (sum/N)+0.5 )를 10진수로 출력하는것이었는데 음수의 경우 원하는 결과가 나오지 않았다.

=> ( (sum/N) + 0.5 )의 결과에 '버림'연산(floor)을 진행한 후에 int형으로 출력하였다.

'BOJ' 카테고리의 다른 글

BOJ 11650번 :: 좌표 정렬하기  (0) 2019.11.24
BOJ 1427번 :: 소트인사이드  (0) 2019.11.23
BOJ 1436번 :: 영화감독 숌  (0) 2019.11.23
BOJ 1018번 :: 체스판 다시 칠하기  (0) 2019.11.21
BOJ 7568번 :: 덩치  (0) 2019.11.21

+ Recent posts