Rylah's Study & Daily Life

[BOJ/C++] 10807. 개수 세기 본문

BOJ

[BOJ/C++] 10807. 개수 세기

Rylah 2022. 4. 3. 15:49

https://www.acmicpc.net/problem/10807

 

10807번: 개수 세기

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거

www.acmicpc.net

 

개수 세기

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 8339 6033 5281 73.531%

문제

총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.

예제 입력 1 복사

11
1 4 1 2 4 2 4 2 3 4 4
2

예제 출력 1 복사

3

예제 입력 2 복사

11
1 4 1 2 4 2 4 2 3 4 4
5

예제 출력 2 복사

0

출처

풀이

1. Counting Sort

 - 공간복잡도가 더 들어간다는 단점이 있다. 하지만 범위가 -100 ~ 100이기에 201개의 배열을 잡는다면 해결이 쉽다.

 - 시간복잡도도 배열을 이용하기에 임의 접근인 O(1)으로 해결을 할 수 있다. (세어둔 이후 검색 기준)

 - 전체적인 시간 복잡도는 O(201)이 최대일 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// BaaarkingDog 실전 알고리즘 학습
// 0x03. Array
// 10807. 개수 세기
// Write : Rylah
// Date : 2022. 04. 03
 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n;
    cin >> n;
    vector<int> v(2020);
 
    for (int i = 0; i < n; i++)
    {
        int input;
        cin >> input;
        v[input + 100]++;
    }
 
    int target;
    cin >> target;
 
    cout << v[target + 100<< "\n";
 
 
 
    return 0;
}
 
cs

 

2. 이분 탐색

- 일반적인 상황에서 생각해볼 만한 이분탐색 풀이이다.

- 정렬 이후에 가장 처음에 나온 수의 위치 (lower_bound), 그 수보다 큰 수가 나온 첫 위치(upper_bound)를 이용해서 간극을 구한다.

- 다만 lower_bound가 벡터의 end를 가리킨다면, 그 수를 못찾은 것이기 때문에 0을 출력한다.

- 시간 복잡도는 O(NlogN)이다. 정렬이 모든 시간복잡도를 잡아먹는다.

- 이분탐색은 O(logN)이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// BaaarkingDog 실전 알고리즘 학습
// 0x03. Array
// 10807. 개수 세기
// Write : Rylah
// Date : 2022. 04. 03
 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n;
    cin >> n;
    vector<int> v(n, 0);
 
    for (int i = 0; i < n; i++)
        cin >> v[i];
 
    sort(v.begin(), v.end());
 
    int target;
    cin >> target;
 
    if (lower_bound(v.begin(), v.end(), target) == v.end())
        cout << 0 << "\n";
    else
    {
        cout << (upper_bound(v.begin(), v.end(), target) - v.begin()) - (lower_bound(v.begin(), v.end(), target) - v.begin());
    }
    
 
 
 
    return 0;
}
 
cs

 

위가 이분탐색 아래가 Counting Sort 풀이이다. TestCase가 작아서 메모리나 시간에서 큰 차이를 보이지 않는다.

 

'BOJ' 카테고리의 다른 글

[BOJ/C++] 11328. Strfry  (0) 2022.04.03
[BOJ/C++] 13300. 방 배정  (0) 2022.04.03
[BOJ/C++] 3273. 두 수의 합  (0) 2022.04.03
[BOJ/C++] 1475. 방 번호  (0) 2022.04.03
[BOJ/C++] 10808. 알파벳 개수  (0) 2022.04.03