Problem
Problem URL : 캠핑
[1] Wrong Code (18. 07. 26)
#define v vector<int>
bool inRange(v i, v j,v k){
int in_x = 0, in_y = 0;
if( ( i[0] < k[0] && k[0] < j[0] ) || (i[0] > k[0] && k[0] > j[0]) )
in_x = 1;
if( ( i[1] < k[1] && k[1] < j[1] ) || (i[1] > k[1] && k[1] > j[1]) )
in_y = 1;
return in_x * in_y ;
}
int solution(int n, vector<vector<int>> data) {
int answer = 0;
int size = (int) data.size();
sort(data.begin(), data.end());
for(int i=0; i<size; i++){
for(int j=i+1; j<size; j++){
if(data[i][0] == data[j][0] || data[i][1] == data[j][1]) continue;
int flag = 1;
for(int k=0; k<size; k++){
if(k == i || k == j){
continue;
}
if( inRange(data[i],data[j],data[k]) ) {
flag = 0;
break;
}
}
if(flag)
answer++;
}
}
return answer;
}
[1] Wrong Code (18. 07. 26)
- O(n^3) 이라서 시간초과가 뜰거 알았지만
inRange
함수를 만들어 보기 위해서 코딩했다.
[1] Answer Code (18. 07. 26)
int solution(int n, vector<vector<int>> data) {
int answer = 0;
int size = (int) data.size();
sort(data.begin(), data.end());
for(int i=0; i<size; i++){
for(int j=i+1; j<size; j++){
if(data[i][0] == data[j][0] || data[i][1] == data[j][1]) continue;
for(int k=j-1; k>i; k--){
if(data[k][0] < max(data[i][0],data[j][0]) &&
data[k][0] > min(data[i][0],data[j][0]) &&
data[k][1] < max(data[i][1],data[j][1]) &&
data[k][1] > min(data[i][1],data[j][1])){
answer--; // [1]
break;
}
}
answer++; // [2]
}
}
return answer;
}
[1] Answer Code (18. 07. 26)
-
[2] 코드로 인해 무조건 +1 해준다. 그렇기 때문에 안되는경우에는 [1]에서 빼주고 [2]더해주면 0이된다.
-
틀렸을때와 큰 로직 차이는 없다.
for(int k=0; k<size; k++) 이코드 문제였다. 어차피 i,j사이에서 겹치는 것만 체크해주면 된다. -
그리고 inRange함수가 시간을 굉장히 많이 잡아 먹는거 같다.
-
또한 inRange함수에 조건문 보다는 max,min을 사용하여 조건체크하는게 효율적인거 같다.
-
내가 푼건 O(n^3)을 최적화해서 풀었다. O(n^2) 방법 코드를 공부해야겠다.