링크
https://www.acmicpc.net/problem/13423
13423번: Three Dots
직선 위에 서로 다른 N개의 점이 찍혀 있다. 점 i의 위치는 Xi이다. N개의 점 중 3개를 골라 가장 왼쪽에 있는 점을 a, 가운데 있는 점을 b, 가장 오른쪽에 있는 점을 c라고 하자. 각각의 점의 위치는
www.acmicpc.net
풀이
문제를 처음 보자마자 떠올린 풀이는 nC3으로 세 점을 뽑는 방법이였지만 시간복잡도 때문에 두 점을 뽑고 이진탐색으로 나머지 한 점이 찍혀있는지 확인하는 방법으로 풀었습니다.
하지만 위 방법으로 풀어도 시간초과가 떠서 이리저리 코드를 바꿔보면서 한참 해맸는데 (분명 시간복잡도 계산해 보면 시간 초과가 뜰리가 없는데...)
이진 탐색을 구현하는 함수 코드에서 call by reference가 아닌 call by value를 해버려서 시간초과가 난 것 같습니다 😂
코드
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
bool binary_search(vector<int> & v, int n) {
int st = 0, ed = v.size() - 1;
while (st <= ed) {
int mid = (st + ed) / 2;
if (v[mid] == n) return true;
else if (v[mid] < n) {
st = mid + 1;
} else {
ed = mid - 1;
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end());
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (abs(v[i] + v[j]) % 2 == 0 && (binary_search(v, (v[i] + v[j]) / 2))) ans++;
}
}
cout << ans << '\n';
}
}
'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ / c++] 2798번 - 블랙잭 (2) | 2022.01.12 |
---|---|
[BOJ / c++] 1107번 - 리모컨 (0) | 2022.01.11 |
[BOJ / python] 1969 : DNA (0) | 2022.01.11 |
[BOJ / Swift] 13423 - Three Dots (0) | 2022.01.10 |
코딩 테스트 준비 스터디 출석부 (0) | 2022.01.08 |
링크
https://www.acmicpc.net/problem/13423
13423번: Three Dots
직선 위에 서로 다른 N개의 점이 찍혀 있다. 점 i의 위치는 Xi이다. N개의 점 중 3개를 골라 가장 왼쪽에 있는 점을 a, 가운데 있는 점을 b, 가장 오른쪽에 있는 점을 c라고 하자. 각각의 점의 위치는
www.acmicpc.net
풀이
문제를 처음 보자마자 떠올린 풀이는 nC3으로 세 점을 뽑는 방법이였지만 시간복잡도 때문에 두 점을 뽑고 이진탐색으로 나머지 한 점이 찍혀있는지 확인하는 방법으로 풀었습니다.
하지만 위 방법으로 풀어도 시간초과가 떠서 이리저리 코드를 바꿔보면서 한참 해맸는데 (분명 시간복잡도 계산해 보면 시간 초과가 뜰리가 없는데...)
이진 탐색을 구현하는 함수 코드에서 call by reference가 아닌 call by value를 해버려서 시간초과가 난 것 같습니다 😂
코드
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
bool binary_search(vector<int> & v, int n) {
int st = 0, ed = v.size() - 1;
while (st <= ed) {
int mid = (st + ed) / 2;
if (v[mid] == n) return true;
else if (v[mid] < n) {
st = mid + 1;
} else {
ed = mid - 1;
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end());
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (abs(v[i] + v[j]) % 2 == 0 && (binary_search(v, (v[i] + v[j]) / 2))) ans++;
}
}
cout << ans << '\n';
}
}
'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ / c++] 2798번 - 블랙잭 (2) | 2022.01.12 |
---|---|
[BOJ / c++] 1107번 - 리모컨 (0) | 2022.01.11 |
[BOJ / python] 1969 : DNA (0) | 2022.01.11 |
[BOJ / Swift] 13423 - Three Dots (0) | 2022.01.10 |
코딩 테스트 준비 스터디 출석부 (0) | 2022.01.08 |