하다보니

3273번-두 수의 합 본문

알고리즘 풀이/백준

3273번-두 수의 합

claire 2022. 1. 13. 15:50
#include<bits/stdc++.h>
using namespace std;

int num[100000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n, a, x, cnt = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a;
		num[i] = a;
	}
	cin >> x;
	for (int i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			if (num[i]+num[j]==x){
				cnt += 1;
			}
		}
	}
	cout << cnt;
}

위의 코드로 풀었더니 시간초과가 나왔다. 당연히 이중 for문이면 O(n^2)이니 주저했어야했는데 c++의 빠른 채점 속도에 잠시 안일했다..ㅎ

 

#include<bits/stdc++.h>
using namespace std;

int arr[100000];
bool exist[2000000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n, x, cnt = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
		exist[arr[i]] = true;
	}
	cin >> x;
	for (int i = 0; i < n; i++) {
		if (x - arr[i] > 0 && exist[x - arr[i]]) {
			cnt += 1;
		}
	}
	
	cout << cnt/2;
}

내가 수정해서 제출한 풀이이다. 

아래는 아이디어는 같지만 x의 합을 갖는 쌍의 수를 세는 방법이 조금 달라서 첨부한다. 

#include <bits/stdc++.h>
using namespace std;

int a[1000001]={};
// 각 자연수의 존재 여부를 저장하는 배열, 아래에서 x-a[i]가 1000000보다 큰 경우를 예외처리하기 싫어서 그냥 배열을 최대 200만으로 잡음
bool occur[2000001];
int n, x;

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  int ans = 0;
  cin >> n;
  for(int i = 0; i < n; i++) cin >> a[i];
  cin >> x;

  for (int i = 0; i < n; i++) {
    // x-a[i]가 존재하는지 확인
    if(x-a[i] > 0 && occur[x-a[i]]) ans++;
    occur[a[i]] = true;
  }
  cout << ans;
}

'알고리즘 풀이 > 백준' 카테고리의 다른 글

5397번-키로거  (0) 2022.01.18
1406번-에디터  (0) 2022.01.17
1475번-방 번호  (0) 2022.01.13
2577번-숫자의 개수  (0) 2022.01.13
10808번-알파벳 개수  (0) 2022.01.13