- Problem
- Answer Code (1) [18. 02. 11]
- Answer Code (2) [18. 02. 11]
- Answer Code (3) [18. 02. 11]
- Code Review
- Reivew [18. 02. 11]
Problem
Problem URL : 숫자 카드 2
Answer Code (1) [18. 02. 11]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int ans;
void go(int value){
if (! binary_search(v.begin(), v.end(), value)){
ans = 0;
printf("%d ",0);
return ;
}
int l = 0, r = (int) v.size()-1;
int cnt = 0;
while (l <= r) {
int mid = ( l + r ) >> 1;
if( value == v[mid]){
// [1]
/*
for( int i=l; i<=r; i++)
if( value == v[i] )
ans ++;
break;
*/
// [2]
cnt ++;
for(int i=mid+1; v[i] == value; i++){
cnt++;
}
for(int i=mid-1; v[i] == value; i--){
cnt++;
}
break;
}
else if( value > v[mid] ){
l = mid + 1;
}
else {
r = mid - 1;
}
}
ans = cnt;
printf("%d ",ans);
}
int main() {
int n,m;
cin >> n;
int input;
for(int i=0; i<n; i++){
scanf("%d",&input);
v.push_back(input);
}
sort(v.begin(), v.end());
// Sector 1 Begin
cin >> m;
vector<int> v2;
for(int i=0; i<m; i++){
scanf("%d",&input);
v2.push_back(input);
// [3]
if( i>0 ){
if( v2[i] == v2[i-1]){
printf("%d ",ans );
continue;
}
}
go(input);
}
// Sector 1 End
// Sector 2 Begin
cin >> m;
int pre_input = 10000001 ;
for(int i=0; i<m; i++){
scanf("%d",&input);
if( input == pre_input ){
printf("%d ",ans );
pre_input = input;
continue;
}
pre_input = input;
go(input);
}
// Sector 2 End
return 0;
}
Answer Code (2) [18. 02. 11]
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(void) {
int n;
scanf("%d", &n);
vector<int> v;
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
v.push_back(num);
}
sort(v.begin(), v.end());
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
if (binary_search(v.begin(), v.end(), num) == 0) {
printf("0 ");
}
else{
printf("%ld ", upper_bound(v.begin(), v.end(), num) - lower_bound(v.begin(), v.end(), num));
}
}
}
Answer Code (3) [18. 02. 11]
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int arr[20000005];
int n, m;
int main() {
scanf("%d", &n);
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
arr[10000000 + x]++;
}
scanf("%d", &m);
while (m--) {
int x; scanf("%d", &x);
printf("%d ", arr[x + 10000000]);
}
return 0;
}
Code Review
Answer Code (1) [18. 02. 11]
[1] or [2] 두개다 맞다 !
[3]을 넣으니까 맞는다.
넣지 않으면 97% 시간 초과가 뜬다.
저 Code는
i 번째 일 때 i-1과 같은지만 체크해주는건데 …
저 Code 1줄이 그렇게 큰 역할을 하다니
ex) 5 5 5 5 5 5 5 이런식이면
[3]에 의해서 go()함수를 돌지 않는다.
이 부분에서 시간을 단축시키는 구나 !
Sector 1 의 논리를 파악하고 나니
굳이 v2를 사용할 필요가 없어서
Sector 2 처럼 바꿨다.
역시나 논리가 같으니 맞았습니다 !
Answer Code (2) [18. 02. 11]
Code By 임재훈
upper_bound(v.begin(), v.end(), num)
lower_bound(v.begin(), v.end(), num))
2개의 함수에 대해 공부를 해보자 !
Answer Code (1)에서 [1]과 [2]의 로직을
upper_bound()
와 lower_bound()
를 이용하여 구현한다.
2개의 함수를 정리한 Post를 참고하자 !
Answer Code (3) [18. 02. 11]
배열로 음수를 표현 못하니까
최대 음수값을 양수로 만들어서 표현하다니 …
Code Review 할 때
아이디어에 놀랐다.
Reivew [18. 02. 11]
-
내 로직이 왜 틀릴까 … 그래서 이것 저것 조금씩 바꿔가면서 체크해봤다.
-
시간은 많이 할애하였지만 그 만큼 많이 배웠다.