κ°μ
ν΄μ 맡μ νμ©ν μΉ΄μ΄ν μ μΌλ°μ μΈ ν¨ν΄ μ€ νλμ΄λ€. μ¬κΈ°μ βμΉ΄μ΄ν βμ΄λ λ€μν νλͺ©λ€μ λ°μ λΉλλ₯Ό μΆμ νλ κ²μ λ§νλ€. μ΄λ μ°λ¦¬μ ν΄μ λ§΅μ΄ ν€λ₯Ό μ μ κ°μ λμμν€κ² λ¨μ μλ―Ένλ€. μ΄λ€ κ²μ μΈμ΄μΌ ν νμκ° μμ λ, κ·Έ μμ μ μν΄ ν΄μ 맡μ μ¬μ©νλ κ²μ κ³ λ €ν΄ λ³Ό μ μλ€.
μ¬λΌμ΄λ© μλμ°λ₯Ό μ΄ν΄λ³΄λ©΄, μΌλΆ λ¬Έμ λ€μ΄ μλμ° λ΄ νΉμ μμμ μλ₯Ό μ ννλ κ²μ μ μ½ μ‘°κ±΄μΌλ‘ μΌλ κ²μ μ μ μλ€. μλ₯Ό λ€μ΄, μ΅λ k
κ°μ 0
μ ν¬ν¨νλ κ°μ₯ κΈ΄ λΆλΆ λ¬Έμμ΄ λ¬Έμ κ° μλ€. μ΄λ¬ν λ¬Έμ μμλ μ€μ§ νλμ μμ(0
)μλ§ μ§μ€νκ³ μκΈ° λλ¬Έμ κ°λ¨ν μ μ λ³μ curr
μ μ¬μ©ν μ μμλ€. λ°λ©΄, ν΄μ 맡μ μ¬λ¬ μμλ₯Ό ν¬ν¨νλ μ μ½ μ‘°κ±΄μ΄ μλ λ¬Έμ λ€μ ν΄κ²°ν μ μλ μλ‘μ΄ λ°©λ²μ μ 곡νλ€. μ΄μ ν΄μ 맡μ νμ©νλ μ¬λΌμ΄λ© μλμ° μμλ₯Ό μ΄ν΄λ³΄λ©° μμν΄λ³΄μ.
μμ 1: μ΅λ kκ°μ μλ‘ λ€λ₯Έ λ¬Έμλ₯Ό ν¬ν¨νλ κ°μ₯ κΈ΄ λΆλΆ λ¬Έμμ΄μ κΈΈμ΄
λ¬Έμμ΄
s
μ μ μk
κ° μ£Όμ΄μ‘μ λ, μ΅λk
κ°μ μλ‘ λ€λ₯Έ λ¬Έμλ₯Ό ν¬ν¨νλ κ°μ₯ κΈ΄ λΆλΆ λ¬Έμμ΄μ κΈΈμ΄λ₯Ό μ°Ύμ보μ.μλ₯Ό λ€μ΄,
s = "eceba"
μk = 2
κ° μ£Όμ΄μ§λ©΄,3
μ΄λΌλ κ²°κ³Όλ₯Ό λ°ννλ€. μ¬κΈ°μ μ΅λ2
κ°μ μλ‘ λ€λ₯Έ λ¬Έμλ₯Ό κ°μ§ κ°μ₯ κΈ΄ λΆλΆ λ¬Έμμ΄μ"ece"
μ΄λ€.
μ΄ λ¬Έμ λ λΆλΆ λ¬Έμμ΄μ λ€λ£¨κ³ , λΆλΆ λ¬Έμμ΄μ μ΅λ k
κ°μ μλ‘ λ€λ₯Έ λ¬ΈμλΌλ μ μ½ μ‘°κ±΄μ΄ μλ€. μ΄λ¬ν νΉμ±μΌλ‘ μΈν΄, μ¬λΌμ΄λ© μλμ° κΈ°λ²μ κ³ λ €ν΄ λ³Ό νμκ° μλ€. μ¬λΌμ΄λ© μλμ°λ μ μ½ μ‘°κ±΄μ μλ°ν λκΉμ§ μλμ°λ₯Ό μ€λ₯Έμͺ½μΌλ‘ νμ₯νκ³ , μλ°νλ©΄ μλμ°λ₯Ό μΌμͺ½μΌλ‘ μ€μ¬λκ°λ λ°©μμΌλ‘ μλνλ€. μ΄ λ¬Έμ μμλ μλμ° λ΄μ μλ‘ λ€λ₯Έ λ¬Έμ μμ μ§μ€νλ€. μ΄ μ μ½ μ‘°κ±΄μ νμΈνλ μ ν΅μ μΈ λ°©λ²μ λ§€λ² μ 체 μλμ°λ₯Ό κ²μ¬νλ κ²μΈλ°, μ΄λ $O(n)$μ μκ°μ΄ μμλ μ μλ€. ν΄μ 맡μ μ¬μ©νλ©΄, μ΄ μμ
μ $O(1)$μ μκ°μ μνν μ μλ€.
μλμ° λ΄ λ¬Έμμ λΉλμλ₯Ό μΆμ νκΈ° μν΄ ν΄μ 맡 counts
λ₯Ό μ¬μ©ν μ μλ€. μ΄λ λ¬Έμλ₯Ό λΉλμμ 맀ννλ κ²μ μλ―Ένλ€. μ΄λ μμ μμλ counts
μ κΈΈμ΄(μ¦, ν€μ μ)λ μλ‘ λ€λ₯Έ λ¬Έμμ μλ₯Ό λνλΈλ€. μΌμͺ½μμ μμλ₯Ό μ κ±°ν λ, ν΄λΉ μμμ λΉλμλ₯Ό κ°μμν¬ μ μλ€. λΉλμκ° 0
μ΄ λλ©΄, ν΄λΉ λ¬Έμλ λ μ΄μ μλμ°μ μΌλΆκ° μλλ―λ‘, ν΄λΉ ν€λ₯Ό μμ ν μ μλ€.
μμ 1 μμΈ μ€λͺ
μ¬λΌμ΄λ© μλμ° μκ³ λ¦¬μ¦μ λν΄ μμλ€λ©΄, κ΄λ ¨ λ¬Έμλ₯Ό λ€μ νμΈνκΈ° λ°λλ€.
μ΄ λ¬Έμ μμ μ μ½ μ‘°κ±΄μ βμλμ° λ΄μ μλ κ³ μ ν λ¬Έμμ μβμ΄λ€. μμΉμ μ νμ k
μ΄νμ΄λ€. μλμ° λ΄ κ° λ¬Έμμ λΉλλ₯Ό μΆμ νλ ν΄μ 맡 counts
λ₯Ό μ¬μ©ν μ μλ€. counts
μ κΈΈμ΄λ ν€μ μμ΄λ©°, μ΄λ μ μ½ μ‘°κ±΄μ λνλΈλ€. λ°λΌμ counts
μ κΈΈμ΄κ° k
λ³΄λ€ ν΄ λ, μλμ°λ μ ν¨νμ§ μμ μνκ° λλ€.
λ¬Έμ s[right]
λ₯Ό μΆκ°ν λ, counts λ΄μμ ν΄λΉ λ¬Έμμ λΉλλ₯Ό νλ μ¦κ°μν¨λ€. λ§μ½ counts
λ΄μ ν΄λΉ λ¬Έμκ° μλ€λ©΄, μλ‘μ΄ ν€-κ° μμΈ s[right]: 1
μ μ½μ
νλ€.
λ¬Έμ s[left]
λ₯Ό μ κ±°ν λ, counts
λ΄μμ ν΄λΉ λ¬Έμμ λΉλλ₯Ό νλ κ°μμν¨λ€. λΉλκ° 0
μ΄ λλ©΄, ν΄λΉ λ¬Έμλ λ μ΄μ μ‘΄μ¬νμ§ μλ κ²μ΄λ―λ‘, ν΄μ 맡μμ ν΄λΉ ν€λ₯Ό μμ νκ³ counts
μ κΈΈμ΄λ₯Ό μ€μΈλ€.
μλμ°μ κΈΈμ΄λ right - left + 1
λ‘ κ³μ°λλ€λ μ μ κΈ°μ΅νμ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int findLongestSubstring(string s, int k) {
unordered_map<char, int> counts;
int left = 0, ans = 0;
for (int right = 0; right < s.size(); right++) {
counts[s[right]]++;
while (counts.size() > k) {
counts[s[left]]--;
if (counts[s[left]] == 0) {
counts.erase(s[left]);
}
left++;
}
ans = max(ans, right - left + 1);
}
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fn find_longest_substring(s: &str, k: usize) -> usize {
let mut counts: HashMap<char, i32> = HashMap::new();
let (mut left, mut ans) = (0, 0);
for (right, c) in s.chars().enumerate() {
*counts.entry(c).or_insert(0) += 1;
while counts.len() > k {
let left_char = s.chars().nth(left).unwrap();
*counts.get_mut(&left_char).unwrap() -= 1;
if counts[&left_char] == 0 {
counts.remove(&left_char);
}
left += 1;
}
ans = ans.max(right - left + 1);
}
ans
}
μ΄ μ½λμμ λ³Ό μ μλ―μ΄, ν΄μ 맡μ νμ©νμ¬ μνλ ν€μ λΉλλ₯Ό μ μ₯ν¨μΌλ‘μ¨, μ¬λ¬ μμμ λν μ μ½μ ν¬ν¨νλ μ¬λΌμ΄λ© μλμ° λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€. μ΄μ μ μ΄ν΄λ³Έ λ°μ κ°μ΄, κ° for λ¬Έ λ°λ³΅λ§λ€ μνλλ μμ μ΄ μΌμ ν μκ° λ΄μ μ²λ¦¬λλ©΄, μ¬λΌμ΄λ© μλμ° λ¬Έμ μ μκ° λ³΅μ‘λλ $O(n)$μ΄ λλ€. μ΄ κ²½μ° ν΄μ λ§΅μ΄ $O(1)$μ μ°μ° μκ°μ κ°μ§κ³ μκΈ° λλ¬Έμ ν΄λΉ 쑰건μ λ§μ‘±νλ€. ν΄μ 맡μ $O(k)$μ 곡κ°μ μ°¨μ§νλ©°, $k$λ₯Ό μ΄κ³Όνλ κ²½μ° μκ³ λ¦¬μ¦μ ν΄μ 맡μμ ν΄λΉ μμλ₯Ό μ κ±°νλ€.
μμ 2: μ¬λ¬ λ°°μ΄μ κ΅μ§ν©
μλ‘ λ€λ₯Έ μ μλ€λ‘ μ΄λ£¨μ΄μ§
n
κ°μ λ°°μ΄μ ν¬ν¨ν 2μ°¨μ λ°°μ΄nums
κ° μ£Όμ΄μ§ λ, λͺ¨λ λ°°μ΄μ 곡ν΅μΌλ‘ λνλλ μ«μλ€μ ν¬ν¨ν μ λ ¬λn
κ°μ λ°°μ΄μ λ°νν΄λ³΄μ.μλ₯Ό λ€μ΄,
nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]
μ΄ μ£Όμ΄μ§λ€λ©΄,[3, 4]
λ₯Ό λ°ννλ€.3
κ³Ό4
λ λͺ¨λ λ°°μ΄μ 곡ν΅μΌλ‘ λνλλ μ μΌν μ«μλ€μ΄λ€.
μ΄ λ¬Έμ μμ κ° λ°°μ΄μ μλ‘ λ€λ₯Έ μ μλ€μ ν¬ν¨νλ€κ³ νλ€. μ΄λ νΉμ μ«μκ° n
λ² λνλλ€λ©΄ κ·Έ μ«μκ° λͺ¨λ λ°°μ΄μ λνλκ³ μμμ μλ―Ένλ€.
ν΄μ 맡 counts
λ₯Ό νμ©νμ¬ μμλ€μ λΉλλ₯Ό μΈμ΄λ³΄μ. κ° λ΄λΆ λ°°μ΄μ μννλ©° counts
λ₯Ό κ° μμλ‘ μ
λ°μ΄νΈνλ€. λͺ¨λ λ°°μ΄μ μνν ν, ν΄μ 맡μ ν΅ν΄ n
λ² λνλλ μ«μλ€μ μ°ΎμλΌ μ μλ€.
μμ 2 μμΈ λ΄μ©
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vector<int> intersection(vector<vector<int>>& nums) {
unordered_map<int, int> counts;
for (vector<int>& arr: nums) {
for (int x: arr) {
counts[x]++;
}
}
int n = int(nums.size());
vector<int> ans;
for (auto [key, val]: counts) {
if (val == n) {
ans.push_back(key);
}
}
sort(ans.begin(), ans.end());
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn intersection(nums: Vec<Vec<i32>>) -> Vec<i32> {
let mut counts = HashMap::new();
for arr in nums.iter() {
for &x in arr {
*counts.entry(x).or_insert(0) += 1;
}
}
let n = nums.len() as i32;
let mut ans: Vec<i32> = counts.into_iter()
.filter(|&(_key, val)| val == n)
.map(|(key, _val)| key)
.collect();
ans.sort_unstable();
ans
}
ν΄μ 맡μ μ¬μ©νλ κ²μ΄ νΈλ¦¬ν μ΄μ κ° μ΄ λ¬Έμ μμ μ λλ¬λλ€. ν€κ° μ μμΈλ° μ λ°°μ΄ λμ ν΄μ 맡μ μ¬μ©νμ§ μλμ§ μλ¬Έμ κ°μ§ μ μλ€. λ°°μ΄μ μ¬μ©ν μλ μμ§λ§, λ°°μ΄μ μ΅λ μμ ν¬κΈ°λ§νΌ μ»€μΌ νλ€. μλ₯Ό λ€μ΄, [1, 2, 3, 1000]
κ°μ ν
μ€νΈ μΌμ΄μ€κ° μλ€λ©΄, 1000
ν¬κΈ°μ λ°°μ΄μ μ΄κΈ°νν΄μΌ νλ©°, μ€μ μ¬μ©λλ μΈλ±μ€λ μμμ λΆκ³Όνλ€. λ°λΌμ λ°°μ΄μ μ¬μ©νλ©΄ 곡κ°μ΄ ν¬κ² λλΉλ μ μλ€. ν΄μ 맡μ λλλ‘ μ€λ²ν€λκ° μμ μ μμ§λ§, μ λ°μ μΌλ‘ λ μμ νλ€. μ
λ ₯μ 99999999999
κ°μ ν° μ«μκ° μμ΄λ ν΄μ 맡μ λ€λ₯Έ μμμ²λΌ μ μ ν μ²λ¦¬νλ€.
$n$κ°μ 리μ€νΈκ° μκ³ κ° λ¦¬μ€νΈμ νκ· μ μΌλ‘ $m$κ°μ μμκ° μλ€κ³ κ°μ νμ. ν΄μ 맡μ μ±μ°λ λ°λ λͺ¨λ μμλ₯Ό μννλ λ° $O(n \cdot m)$μ μκ°μ΄ μμλλ€. ans
μ μ΅λ $m$κ°μ μμκ° λ€μ΄κ° μ μμΌλ―λ‘, μ΅μ
μ κ²½μ° μ λ ¬νλ λ°λ $O(m \cdot \log m)$μ μκ°μ΄ λ λ€. λ°λΌμ μκ° λ³΅μ‘λλ $O(n \cdot m + m \cdot \log m) = O(m \cdot (n + \log m))$μ΄λ€. μ
λ ₯μ λͺ¨λ μμκ° κ³ μ νλ€λ©΄, ν΄μ 맡μ $n \cdot m$ ν¬κΈ°λ‘ μ¦κ°νλ―λ‘, μκ³ λ¦¬μ¦μ κ³΅κ° λ³΅μ‘λλ $O(n \cdot m)$μ΄λ€.
μμ 3: λͺ¨λ λ¬Έμκ° λμΌν νμλ‘ λ°μνλμ§ νμΈνκΈ°
λ¬Έμμ΄
s
κ° μ£Όμ΄μ‘μ λ, λͺ¨λ λ¬Έμκ° λμΌν λΉλλ‘ λνλλμ§ νμΈν΄λ³΄μ.μλ₯Ό λ€μ΄,
s = "abacbc"
κ° μ£Όμ΄μ§λ©΄ λͺ¨λ λ¬Έμκ° λ λ² λνλ―λ‘ trueλ₯Ό λ°ννλ€. λ°λ©΄,s = "aaabb"
κ° μ£Όμ΄μ§λ©΄"a"
λ 3λ²,"b"
λ 2λ² λνλκΈ° λλ¬Έμ falseλ₯Ό λ°ννλ€(3 != 2
).
ν΄μ 맡과 μΈνΈμ μ§μμ νμ©νλ©΄, μ΄ λ¬Έμ λ κ°λ¨νκ² ν΄κ²°ν μ μλ€. ν΄μ 맡 counts
λ₯Ό μ¬μ©νμ¬ λͺ¨λ λ¬Έμμ λΉλλ₯Ό μΈμ΄λ³Έλ€. s
λ₯Ό μννλ©° λͺ¨λ λ¬Έμμ λΉλλ₯Ό μ»λλ€. κ·Έλ° λ€μ λͺ¨λ λΉλκ° λμΌνμ§ νμΈνλ€.
μΈνΈλ μ€λ³΅μ 무μνκΈ° λλ¬Έμ, λͺ¨λ λΉλλ₯Ό μΈνΈμ λ£κ³ κΈΈμ΄κ° 1
μΈμ§ νμΈνλ©΄ λͺ¨λ λΉλκ° κ°μμ§ κ²μ¦ν μ μλ€.
μμ 3 μμΈ μ€λͺ
μΈνΈλ λΉλλ₯Ό 무μνλ€λ μ¬μ€μ κΈ°μ΅νμ. κ°μ μμλ₯Ό μΈνΈμ 100λ² μΆκ°ν΄λ 첫 λ²μ§Έ μμ λ§ μμλ₯Ό μΆκ°νκ³ λλ¨Έμ§λ μ무 μν₯μ λ―ΈμΉμ§ μλλ€.
μ΄ λ¬Έμ μμλ νλμ κ³ μ λΉλλ§ μ‘΄μ¬νλμ§ νλ¨νλ €κ³ νλ€. λ¨Όμ ν΄μ 맡μ μ¬μ©νμ¬ κ° λ¬Έμμ λΉλλ₯Ό μΈμ΄λ³Έλ€. μΈλ μμ μ΄ λλ ν, ν΄μ 맡μ κ°λ€μ μ°λ¦¬κ° μ°Ύλ λΉλκ° λλ€.
λ§μ½ νλμ κ³ μ λΉλλ§ μλ€λ©΄, λͺ¨λ κ°μ μΈνΈμ μΆκ°ν ν μΈνΈμ κΈΈμ΄λ 1μ΄ λ κ²μ΄λ€. λ€λ₯Έ λΉλλ₯Ό κ°μ§ λ¬Έμκ° μλ€λ©΄ μΈνΈμ κΈΈμ΄λ 1λ³΄λ€ μ»€μ§ κ²μ΄λ€. μ΄λ μΈνΈκ° λͺ¨λ κ³ μ λΉλλ₯Ό ν¬ν¨νκ² λκΈ° λλ¬Έμ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
bool areOccurrencesEqual(string s) {
unordered_map<char, int> counts;
for (char c: s) {
counts[c]++;
}
unordered_set<int> frequencies;
for (auto [key, val]: counts) {
frequencies.insert(val);
}
return frequencies.size() == 1;
}
1
2
3
4
5
6
7
8
9
10
11
fn are_occurrences_equal(s: &str) -> bool {
let mut counts: HashMap<char, i32> = HashMap::new();
for c in s.chars() {
*counts.entry(c).or_insert(0) += 1;
}
let frequencies: HashSet<&i32> = counts.values().collect();
frequencies.len() == 1
}
s
μ κΈΈμ΄λ₯Ό $n$μ΄λΌκ³ ν λ, ν΄μ 맡μ μ±μ°λ λ° $O(n)$μ λΉμ©μ΄ λ λ€. κ·Έ λ€μ, ν΄μ 맡μ κ°λ€μ μΈνΈλ‘ λ³ννλ λ° $O(n)$μ΄ μμλλ€. λ°λΌμ μκ° λ³΅μ‘λλ $O(n)$μ΄λ€. ν΄μ 맡과 μΈνΈκ° μ°¨μ§νλ 곡κ°μ κ³ μ λ¬Έμμ μμ ν΄λΉνλ€. μ΄μ μ λ
Όμλ λ°μ κ°μ΄, μΌλΆ μ¬λλ€μ μμ΄ μνλ²³μμ μ λν λ¬Έμλ€μ΄κΈ° λλ¬Έμ μ΄λ₯Ό $O(1)$μ΄λΌκ³ μ£Όμ₯νλ€. λ³΄λ€ μΌλ°μ μΈ λλ΅μ κ³΅κ° λ³΅μ‘λκ° $O(k)$λΌκ³ λ§νλ κ²μ΄λ€. μ¬κΈ°μ $k$λ μ
λ ₯μ ν¬ν¨λ μ μλ λ¬Έμμ μλ‘, μ΄ λ¬Έμ μμλ 26μ΄λ€.
βμ ννβ μ μ½ μ‘°κ±΄μ κ°μ§ λΆλΆ λ°°μ΄μ μ κ³μ°νκΈ°
μ°λ¦¬λ μ΄μ μ¬λΌμ΄λ© μλμ° κ΄λ ¨ κΈμμ, βμ μ½ μ‘°κ±΄μ λ§λ λΆλΆ λ°°μ΄/λΆλΆ λ¬Έμμ΄μ μλ₯Ό μ°Ύλ ν¨ν΄βμ λν΄ λ
Όμνλ€. μ΄λ° μ νμ λ¬Έμ μμλ left
μ right
μ¬μ΄μ μλμ°κ° μ μ½ μ‘°κ±΄μ λ§μ‘±νλ€λ©΄, left < x <= right
λ²μ λ΄μ λͺ¨λ x
μμ right
κΉμ§μ μλμ°λ κ°μ μ μ½ μ‘°κ±΄μ λ§μ‘±νλ€.
μ΄λ²μλ λ μ격ν μ μ½ μ‘°κ±΄μ κ°μ§ λ¬Έμ λ€μ μ΄ν΄λ³Ό κ²μ΄λ€. μ΄μ μ μΈκΈλ μμ±μ΄ λ°λμ μ°ΈμΌ νμλ μλ€.
μλ₯Ό λ€μ΄, βμμλ§ μλ μ λ ₯μ λν΄ kλ³΄λ€ μμ ν©μ κ°μ§ λΆλΆ λ°°μ΄μ μλ₯Ό μ°Ύλβ λ¬Έμ λ μ¬λΌμ΄λ© μλμ°λ‘ ν΄κ²°ν μ μλ€. μ΄ μΉμ μμλ βμ νν
k
μ κ°μ ν©μ κ°μ§ λΆλΆ λ°°μ΄μ μλ₯Ό μ°Ύλβ κ°μ μ§λ¬Έμ λ€λ£° κ²μ΄λ€.
μ²μμ μ΄ λ¬Έμ λ€μ λ§€μ° μ΄λ €μ λ³΄μΌ μ μλ€. νμ§λ§ μ΄ ν¨ν΄μ λ°°μ°κ³ λλ©΄ λ§€μ° κ°λ¨ν΄μ§λ©°, μ΄ ν¨ν΄μ μνλ κ° λ¬Έμ μ μ½λκ° μΌλ§λ μ μ¬νμ§ μ μ μλ€. μκ³ λ¦¬μ¦μ μ΄ν΄νκΈ° μν΄μλ κ΅¬κ° ν©μ κ°λ μ λ€μ μκ°ν΄λ³Ό νμκ° μλ€.
κ΅¬κ° ν©μ μ¬μ©νλ©΄, λ κ΅¬κ° ν©μ μ°¨μ΄λ‘ λΆλΆ λ°°μ΄μ ν©μ μ°Ύμ μ μλ€. k
μ μ νν κ°μ ν©μ κ°μ§ λΆλΆ λ°°μ΄μ μ°Ύκ³ μ νλ€κ³ κ°μ ν΄λ³΄μ. λν μ
λ ₯μ κ΅¬κ° ν©μ κ°μ§κ³ μλ€κ³ νμ. κ΅¬κ° ν©μμ k
μ κ°μ μ°¨μ΄κ° λνλλ λͺ¨λ κ²½μ°κ° k
μ κ°μ ν©μ κ°μ§ λΆλΆ λ°°μ΄μ λνλΈλ€. κ·Έλ λ€λ©΄ μ΄λ¬ν μ°¨μ΄λ€μ μ΄λ»κ² μ°ΎμκΉ?
λ¨Όμ κ΅¬κ° ν©μ΄ μΌλ§λ μμ£Ό λ°μνλμ§ λ§€ννλ ν΄μ 맡 counts
λ₯Ό μ μΈνλ€. μ΄ ν΄μ 맡μ κ΅¬κ° ν©μ μΌλ§λ μμ£Ό λ°μνλμ§ κΈ°λ‘νλ€(μ
λ ₯μ μμκ° μλ κ²½μ°, μ«μκ° κ΅¬κ° ν©μμ μ¬λ¬ λ² λνλ μ μλ€). counts[0] = 1
λ‘ μ΄κΈ°νν΄μΌ νλ€. μ΄λ λΉ κ΅¬κ° []
μ ν©μ΄ 0
μ΄κΈ° λλ¬Έμ΄λ€.
λ€μμΌλ‘, λ΅μ μ μ₯ν λ³μμ curr
λ₯Ό μ μΈνλ€. μ
λ ₯μ μννλ©΄μ, curr
λ μ§κΈκΉμ§ μνν λͺ¨λ μμλ€μ ν©μ λνλΌ κ²μ΄λ€.
μ
λ ₯μ μννλ λμ, κ° μμμμ curr
λ₯Ό μ
λ°μ΄νΈνκ³ counts
λ ν¨κ» μ
λ°μ΄νΈνλ€. counts
λ₯Ό μ
λ°μ΄νΈνκΈ° μ μ λ¨Όμ λ΅μ μ
λ°μ΄νΈν΄μΌ νλ€.
λ΅μ μ΄λ»κ² μ
λ°μ΄νΈν κΉ? μ¬λΌμ΄λ© μλμ° κ΄λ ¨ κΈμμ βλΆλΆ λ°°μ΄μ μβλ₯Ό μ°Ύμ λ, κ° μΈλ±μ€μ μ§μ€νκ³ νμ¬ μΈλ±μ€μμ λλλ μ ν¨ν λΆλΆ λ°°μ΄μ΄ μΌλ§λ μλμ§ νμ
νλ€. μ¬κΈ°μλ κ°μ λ°©μμ μ¬μ©νλ€. μΈλ±μ€ i
μ λλ¬νλ€κ³ κ°μ νμ. μ΄ μμ κΉμ§ curr
λ i
κΉμ§μ λͺ¨λ μμλ€μ κ΅¬κ° ν©μ μ μ₯νκ³ μλ€. λν i
μ΄μ μ λͺ¨λ λ€λ₯Έ κ΅¬κ° ν©λ€μ counts
μ μ μ₯νλ€. λ°λΌμ i
μμ λλλ k
μ κ°μ ν©μ κ°μ§ λΆλΆ λ°°μ΄μ΄ μλ€λ©΄, curr - k
λ μ΄μ μ μ΄λ―Έ λνλ¬μ΄μΌ νλ€.
κ΅¬κ° ν©μ μ°¨μ΄λ‘ λΆλΆ λ°°μ΄μ ν©μ μ°Ύλλ€λ κ²μ κΈ°μ΅νμ. λ§μ½ curr - k
κ° μ΄ μμ μ΄μ μ κ΅¬κ° ν©μΌλ‘ μ‘΄μ¬νλ€λ©΄, νμ¬ κ΅¬κ° ν©μ΄ curr
μΌ λ, μ΄ λ κ΅¬κ° ν©μ μ°¨μ΄λ curr - (curr - k) = k
λ‘, μ°λ¦¬κ° μ°Ύκ³ μ νλ μ νν κ°μ΄ λλ€.
λ°λΌμ λ΅μ counts[curr - k]
λ‘ μ¦κ°νλ€. λ§μ½ curr - k
ꡬκ°μ΄ μ΄μ μ μ¬λ¬ λ² λνλ¬λ€λ©΄, κ°κ°μ ꡬκ°μ μμμ μΌλ‘ μ¬μ©νμ¬ νμ¬ μΈλ±μ€μμ λλλ k
ν©μ κ°μ§ λΆλΆ λ°°μ΄μ νμ±ν μ μλ€. κ·Έλ κΈ° λλ¬Έμ λΉλλ₯Ό μΆμ νλ κ²μ΄ μ€μνλ€.
μμ 4: ν©μ΄ KμΈ λΆλΆ λ°°μ΄μ μ κ³μ°νκΈ°
μ μ λ°°μ΄
nums
μ μ μk
κ° μ£Όμ΄μ‘μ λ, ν©μ΄k
μΈ λΆλΆ λ°°μ΄μ μλ₯Ό κ³μ°ν΄λ³΄μ.
μ΄ λ¬Έμ λ₯Ό μ΄ν΄νκΈ° μν΄ μμλ₯Ό ν΅ν΄ μκ³ λ¦¬μ¦μ μ΄ν΄λ³΄μ. μλ₯Ό λ€μ΄, nums = [1, 2, 1, 2, 1], k = 3
μΈ κ²½μ°λ₯Ό μκ°ν΄λ³΄μ. ν©μ΄ 3
μΈ λΆλΆ λ°°μ΄μ μ΄ λ€ κ°κ° μλ€ - [1, 2]
κ° λ λ², [2, 1]
μ΄ λ λ²μ΄λ€.
μ΄ μ
λ ₯μ λν κ΅¬κ° ν©μ μννλ λμ curr
κ° λνλ΄λ κ²μΌλ‘, [1, 3, 4, 6, 7]
μ΄λ€. μ΄ λ°°μ΄μμ 3
μ΄λΌλ μ°¨μ΄λ μΈ λ² λνλλ€: (4 - 1)
, (6 - 3)
, (7 - 4)
.
νμ§λ§ μ ν¨ν λΆλΆ λ°°μ΄μ΄ λ€ κ°λΌκ³ νλλ° μ΄λ»κ² μ΄ν΄ν μ μμκΉ? ν΄μ 맡μ 0: 1
λ‘ μ΄κΈ°νν΄μΌ νλ€λ κ²μ κΈ°μ΅ν΄μΌ νλ€. μ΄λ k
μ κ°μ ν©μ κ°μ§ ꡬκ°μ΄ μλ€λ©΄, 0: 1
μ μ΄κΈ°ννμ§ μμΌλ©΄ curr - k = 0
μ΄ ν΄μ 맡μ λνλμ§ μμ μ ν¨ν λΆλΆ λ°°μ΄μ λμΉ μ μκΈ° λλ¬Έμ΄λ€.
λ°λΌμ μΈλ±μ€ 1, 2, 3, 4μμ curr - k
κ° μ΄μ μ λνλ¬μμ μ μ μλ€. λͺ¨λ μμκ° μμμ΄λ―λ‘ curr - k
κ°μ κ°κ° ν λ²μ©λ§ λνλλ€. κ·Έλ¬λ―λ‘ λ΅μ 4
κ° λλ€.
μμ 4 μμΈ μ€λͺ
1
2
3
4
5
6
7
8
9
10
11
12
13
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> counts;
counts[0] = 1;
int ans = 0, curr = 0;
for (int num: nums) {
curr += num;
ans += counts[curr - k];
counts[curr]++;
}
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fn subarray_sum(nums: &[i32], k: i32) -> i32 {
let mut counts = HashMap::new();
counts.insert(0, 1);
let (mut ans, mut curr) = (0, 0);
for &num in nums {
curr += num;
ans += counts.get(&(curr - k)).unwrap_or(&0);
*counts.entry(curr).or_insert(0) += 1;
}
ans
}
curr
κ° κ³μ μ¦κ°νλ€λ©΄ ν΄μ 맡μ κ°μ 1μ λμ§ μμΌλ―λ‘ μΈνΈλ§ μ¬μ©νλ©΄ λμ§ μμκΉ μκ°ν μ μλ€. νμ§λ§ μ μ½ μ‘°κ±΄μ -1000 <= nums[i] <= 1000
μ΄λ€. μλ₯Ό λ€μ΄, nums = [1, -1, 1, -1], k = 0
μΈ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ. λ€ κ°μ μ ν¨ν λΆλΆ λ°°μ΄μ΄ μλ€: [1, -1]
λ λ², [-1, 1]
ν λ², μ 체 λ°°μ΄ [1, -1, 1, -1]
.
κ΅¬κ° ν©μ [1, 0, 1, 0]
μ΄λ€. λ§μ§λ§ μΈλ±μ€μμ λλλ λ κ°μ λΆλΆ λ°°μ΄μ΄ μλ€ - [1, -1]
κ³Ό μ 체 λ°°μ΄. counts[0] = 1
λ‘ μ΄κΈ°ννκΈ° λλ¬Έμ, λ λ²μ§Έ μΈλ±μ€ μ΄νμλ counts[0] = 2
κ° λλ€. λ°λΌμ λ§μ§λ§ μΈλ±μ€μ λλ¬νκ³ ans += counts[curr - k] = ans += counts[0]
λ₯Ό μννλ©΄, λ λΆλΆ λ°°μ΄μ λ΅μ μΆκ°νλ€. μ
λ ₯μ μμκ° ν¬ν¨λμ΄ μμ λ, λμΌν κ΅¬κ° ν©μ΄ μ¬λ¬ λ² λνλ μ μμΌλ©°, λΉλλ₯Ό κ³μ°νκΈ° μν΄ ν΄μ λ§΅μ΄ νμνλ€.
μμ½νμλ©΄:
curr
λ₯Ό μ¬μ©νμ¬ κ΅¬κ° ν©μ μΆμ νλ€.- μ΄λ€ μΈλ±μ€
i
μμ,i
κΉμ§μ ν©μcurr
μ΄λ€. λ§μ½ μΈλ±μ€j
μ κ΅¬κ° ν©μ΄curr - k
λΌλ©΄,j + 1
λΆν°i
κΉμ§μ λΆλΆ λ°°μ΄μ ν©μcurr - (curr - k) = k
κ° λλ€. - λ°°μ΄μ μμκ° μμ μ μκΈ° λλ¬Έμ, λμΌν κ΅¬κ° ν©μ΄ μ¬λ¬ λ² λνλ μ μλ€. ν΄μ 맡
counts
λ₯Ό μ¬μ©νμ¬ κ΅¬κ° ν©μ΄ λͺ λ² λνλ¬λμ§ μΆμ νλ€. - λͺ¨λ μΈλ±μ€
i
μμ,curr - k
μ λΉλλk
μ κ°μ ν©μ κ°μ§ λΆλΆ λ°°μ΄μ μμ κ°μΌλ©°, μ΄λi
μμ λλλ€. μ΄λ₯Ό λ΅μ λνλ€.
μ΄ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λμ κ³΅κ° λ³΅μ‘λλ λͺ¨λ $O(n)$μ΄λ€. μ¬κΈ°μ $n$μ nums
μ κΈΈμ΄μ΄λ€. κ° for λ¬Έ λ°λ³΅μ μμ μκ°μ μ€νλλ©°, ν΄μ 맡μ μ΅λ $n$κ°μ μμλ‘ μ±μ₯ν μ μλ€.
μμ 5: μ’μ λΆλΆ λ°°μ΄μ μ μΈκΈ°
μμ μ μ λ°°μ΄
nums
μ μ μk
κ° μ£Όμ΄μ‘μ λ, μ ννk
κ°μ νμλ₯Ό ν¬ν¨νλ λΆλΆ λ°°μ΄μ μλ₯Ό μ°Ύμ보μ.μλ₯Ό λ€μ΄,
nums = [1, 1, 2, 1, 1], k = 3
μΈ κ²½μ°, λ΅μ2
κ°μ΄λ€.3
κ°μ νμλ₯Ό ν¬ν¨νλ λΆλΆ λ°°μ΄μ[1, 1, 2, 1]
κ³Ό[1, 2, 1, 1]
λ κ°μ§μ΄κΈ° λλ¬Έμ΄λ€.
μ΄μ μμ μμ μ μ½ μ‘°κ±΄μ ν©μ΄μκ³ , curr
μ κ΅¬κ° ν©μ λνλλ€. μ΄ λ¬Έμ μμλ μ μ½ μ‘°κ±΄μ΄ νμμ κ°μμ΄λ―λ‘, curr
μ νμμ μλ₯Ό μΆμ νλ€. κ° μμμμ curr - k
λ₯Ό λ€μ μ‘°νν μ μλ€. μμ ν
μ€νΈ μΌμ΄μ€μμ, λ§μ§λ§ μΈλ±μ€μμ curr = 4
μ΄λ€. μ΄λ λ°°μ΄μ 4
κ°μ νμκ° μμμ μλ―Ένλ€. 첫 λ²μ§Έ μΈλ±μ€μμ curr = 1
μ΄λ€. 4 - 1 = 3
μ΄κ³ , μΈλ±μ€ 1
μμ 4
κΉμ§μ λΆλΆ λ°°μ΄μ λ΅ μ€ νλμ΄λ€([1, 2, 1, 1]
).
μκ° νμμΈμ§ νμΈνκΈ° μν΄μλ ν΄λΉ μλ₯Ό 2λ‘ λλ λλ¨Έμ§λ₯Ό μ·¨νλ©΄ λλ€.
x
κ° νμλΌλ©΄,x % 2 = 1
μ΄λ€.
μμ 5 μμΈ μ€λͺ
μ¬λΌμ΄λ© μλμ°λ₯Ό μ¬μ©νμ§ μμ§λ§, βμ ν¨νβ λΆλΆ λ°°μ΄μ μ°Ύλ κ²μλ κ°μ μμ΄λμ΄λ₯Ό μ μ©ν μ μλ€.
μ΄μ μμ μμ μ μ½ μ‘°κ±΄μ βλΆλΆ λ°°μ΄μ ν©βμ΄μκ³ , μμΉμ μ νμ k
μ κ°μμΌ νλ€.
μ΄ λ¬Έμ μμλ μ μ½ μ‘°κ±΄μ΄ βλΆλΆ λ°°μ΄ λ΄ νμμ κ°μβμ΄λ©°, μμΉμ μ νλ k
μ κ°λ€.
μ¬κΈ°μ κ΅¬κ° ν©μ μ’ λ μ°½μμ μΌλ‘ νμ©ν΄μΌ νλ€. curr
μ κ΅¬κ° ν©μΌλ‘ μ¬μ©νλ λμ , νμ¬ κ΅¬κ°μμ κ΄μ°°λ νμμ μλ₯Ό μΆμ νλ€. μ΄λ₯Ό βκ΅¬κ° νμ κ°μβλΌκ³ λΆλ₯Ό μ μλ€. λ§μ½ curr - k
κ° μ‘΄μ¬νλ€λ©΄, μ΄μ μ curr - k
κ°μ νμλ₯Ό κ°μ§ ꡬκ°μ΄ μμλ€λ λ»μ΄λ€. νμ¬ κ΅¬κ°μλ curr
κ°μ νμκ° μλ€. μ΄ λ κ΅¬κ° μ¬μ΄μ μ°¨μ΄λ κ΅¬κ° μ¬μ΄μ νμ κ°μλ₯Ό λνλ΄λ©°, curr - (curr - k) = k
κ°μ νμκ° λλ€.
μκ° νμμΈ κ²½μ° 2λ‘ λλ λλ¨Έμ§κ° 1
μ΄ λλ€. κ·Έλ μ§ μμΌλ©΄ 0
μ΄ λλ€. λ°λΌμ κ° μμ λν΄ curr += num % 2
λ₯Ό μνν μ μλ€.
μ¬κΈ°μλΆν° λͺ¨λ κ²μ΄ μμ ν λμΌνκ² μλνλ€. μ€μ λ‘, λ λ¬Έμ μ μ½λλ₯Ό λΉκ΅ν΄λ³΄λ©΄ μ°¨μ΄λ "% 2"
λ κΈμλΏμ΄λ€. λ€μ 보λμ€ λ¬Έμ λ€μ μ§μ νμ΄λ³΄λ©° μ΄ κΈμμ λ°°μ΄ μ§μμ μ μ©ν΄λ³΄μ.
1
2
3
4
5
6
7
8
9
10
11
12
13
int numberOfSubarrays(vector<int>& nums, int k) {
unordered_map<int, int> counts;
counts[0] = 1;
int ans = 0, curr = 0;
for (int num: nums) {
curr += num % 2;
ans += counts[curr - k];
counts[curr] += 1;
}
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
fn number_of_subarrays(nums: &[i32], k: i32) -> i32 {
let mut counts = HashMap::new();
counts.insert(0, 1);
let (mut ans, mut curr) = (0, 0);
for &num in nums {
curr += num % 2;
ans += *counts.get(&(curr - k)).unwrap_or(&0);
*counts.entry(curr).or_insert(0) += 1;
}
ans
}
βμ΄ ν¨ν΄μ μνλ κ° λ¬Έμ μ μ½λκ° μΌλ§λ λΉμ·νμ§ μ μ μμ κ²βμ΄λΌκ³ λ§μλλ Έλ κ²μ κΈ°μ΅νλκ°? λ κ°μ§ λ€λ₯Έ λ¬Έμ μ μ½λμ μ°¨μ΄λ λ§ κ·Έλλ‘ β% 2
βλΌλ λ κΈμλΏμ΄λ€. λ€μ λͺ κ°μ§ μ°μ΅ λ¬Έμ λ₯Ό μ§μ νμ΄λ³΄λ©΄μ μ΄ κΈμμ λ°°μ΄ μ§μμ μ μ©ν΄ 보μ.
μ΄ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λμ κ³΅κ° λ³΅μ‘λλ μ΄μ λ¬Έμ μ κ°λ€($O(n)$). κ·Έ μ΄μ λ λμΌνλ€.
보λμ€ λ¬Έμ
- 2225. Find Players With Zero or One Losses
- 1133. Largest Unique Number
- 1189. Maximum Number of Balloons
- 1748. Sum of Unique Elements
- 1394. Find Lucky Integer in an Array
- 1207. Unique Number of Occurrences
- 451. Sort Characters By Frequency
- 1512. Number of Good Pairs
- 930. Binary Subarrays With Sum
- 1695. Maximum Erasure Value
- 567. Permutation in String
μΆμ²: Leetcode