Skip to content

Commit 92675b9

Browse files
committed
풀이: 릿코드.1461.Check If a String Contains All Binary Codes of Size K
?: 슬라이딩 윈도우 & 비트셋을 이용해 풀이
1 parent ace394e commit 92675b9

3 files changed

Lines changed: 122 additions & 0 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 1461. Check If a String Contains All Binary Codes of Size K
2+
3+
[링크](https://leetcode.com/problems/check-if-a-string-contains-all-binary-codes-of-size-k/description/)
4+
5+
| 난이도 |
6+
| :----: |
7+
| Medium |
8+
9+
## 설계
10+
11+
### 시간 복잡도
12+
13+
문자열의 길이를 N, 입력받은 수를 K라 하자.
14+
15+
슬라이딩 윈도우를 사용해 각 K길이의 문자열을 확인할 수 있다.
16+
17+
이를 hash set을 이용할 경우 O(N \* K)의 시간 복잡도를 사용한다.
18+
19+
각 비트셋을 숫자로 변환해 저장할 수 있다. 이 경우 O(N)의 시간 복잡도를 사용한다.
20+
21+
### 공간 복잡도
22+
23+
hash set, 비트셋에 O(2^K)의 공간 복잡도를 사용한다.
24+
25+
### 슬라이딩 윈도우 & 비트셋
26+
27+
| 내 코드 (ms) | 시간 복잡도 | 공간 복잡도 |
28+
| :----------: | :---------: | :---------: |
29+
| 16 | O(N) | O(2^K) |
30+
31+
길이가 K인 문자열을 숫자로 변환해 저장한다.
32+
33+
한칸씩 이동하므로 비트를 이동 후 현재 비트를 더한 숫자를 만든 뒤 2^K로 나눈 나머지를 이용해 윈도우를 저장한다.
34+
35+
각 윈도우마다 방문 여부를 별도 배열로 저장한다.
36+
37+
이후 방문한 윈도우의 종류가 2^K와 같은지 확인한다.
38+
39+
```cpp
40+
bool hasAllCodes(string s, int k) {
41+
int size = s.size();
42+
if (size < k) return false;
43+
44+
int limit = 1 << k;
45+
bool visited[1048576] = {false};
46+
int visitCount = 0;
47+
48+
int temp = 0;
49+
for (int i = 0; i < k - 1; i++) {
50+
temp = temp * 2 + (s[i] - '0');
51+
}
52+
for (int i = k - 1; i < size; i++) {
53+
temp = temp * 2 + (s[i] - '0');
54+
55+
temp %= limit;
56+
if (visited[temp] == false) visitCount++;
57+
visited[temp] = true;
58+
}
59+
60+
return visitCount == limit;
61+
}
62+
```
63+
64+
## 고생한 점
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <algorithm>
2+
#include <climits>
3+
#include <cmath>
4+
#include <cstring>
5+
#include <functional>
6+
#include <iostream>
7+
#include <map>
8+
#include <numeric>
9+
#include <queue>
10+
#include <set>
11+
#include <stack>
12+
#include <string>
13+
#include <unordered_map>
14+
#include <unordered_set>
15+
#include <vector>
16+
17+
using namespace std;
18+
19+
// sliding window & bitset
20+
// time : O(N)
21+
// space : O(2^K)
22+
class Solution {
23+
public:
24+
bool hasAllCodes(string s, int k) {
25+
int size = s.size();
26+
if (size < k) return false;
27+
28+
int limit = 1 << k;
29+
bool visited[1048576] = {false};
30+
int visitCount = 0;
31+
32+
int temp = 0;
33+
for (int i = 0; i < k - 1; i++) {
34+
temp = temp * 2 + (s[i] - '0');
35+
}
36+
for (int i = k - 1; i < size; i++) {
37+
temp = temp * 2 + (s[i] - '0');
38+
39+
temp %= limit;
40+
if (visited[temp] == false) visitCount++;
41+
visited[temp] = true;
42+
}
43+
44+
return visitCount == limit;
45+
}
46+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Input: s = "00110110", k = 2
2+
Output: true
3+
4+
===
5+
6+
Input: s = "0110", k = 1
7+
Output: true
8+
9+
===
10+
11+
Input: s = "0110", k = 2
12+
Output: false

0 commit comments

Comments
 (0)