2022.05.21

bin1225·2022년 5월 21일
0

c++ 알고리즘

목록 보기
7/35
post-thumbnail
  1. 교집합
int main(){

	freopen("input.txt","rt",stdin);
	
	int n,m,k;
	
	cin>>n;
	vector<int> p1;
	for(int i=0; i<n; i++){
		cin>>k;
		p1.push_back(k);
	}
	sort(p1.begin(),p1.end());
	
	cin>>m;
	vector<int> p2;
	for(int i=0; i<m; i++){
		cin>>k;
		p2.push_back(k);
	}
	sort(p2.begin(),p2.end());


	int i=0, j=0;
	while(i<n && j<m){
		if(p1[i]==p2[j]){
			cout<<p1[i]<<' ';
			i++;
			j++;
		}
		else if(p1[i]<p2[j])
			i++;
		else
			j++;
	}
		
	return 0;
	
}

투포인터
sort 함수는 퀵정렬을 사용하는데, 생각보다 성능이 좋은 듯 하다.

  1. 연속된 자연수의 합
int main(){

	//freopen("input.txt","rt",stdin);
	
	int n;
	cin>>n;
	
	int cnt;
	for(int i=2; i<n; i++){
		int sum=n;
		for(int j=1; j<=i; j++){
			sum-=j;
		
		}
		if(sum<0)	break;
		if(sum%i==0){
			int k=sum/i;
			cout<<k+1;
			for(int j=2; j<=i; j++){
				cout<<" +"<<j+k;
			}	
			cout<<" = "<<n<<endl;
			cnt++;
		}
	}
	cout<<cnt;
	
	return 0;
	
}
  • 연속된 수의 합이려면 연속된 수들에서 일정값을 빼도 연속된 상태다. 즉
    15를 3개의 연속된 수로 만들 수 있는지 확인하기 위해서는 15 -1 -2 -3 = 9
    이고 9가 3으로 나누어 떨어지면 가능하다는 것을 확인할 수 있다. ( 9/3 = 3 이고 3을 1,2,3에 분배하는 원리)
    이 아이디어를 힌트로 얻어서 풀었다.
    그냥 배열로 읽어가면서 푸는 건 출력형태를 만드는 게 너무 복잡했다.

강의를 보면 내 코드의 for문 2개를 while문 1개로 대체해버리는데, n값을 tmp에 넣고 계속 업데이트해가면서 이용하면 더 효율적으로 코드작성이 가능해진다.

0개의 댓글