ํ™ˆ [DSA] ๊ตฌ๊ฐ„ ํ•ฉ
ํฌ์ŠคํŠธ
์ทจ์†Œ

[DSA] ๊ตฌ๊ฐ„ ํ•ฉ


Title


๊ฐœ์š”

๊ตฌ๊ฐ„ ํ•ฉ์€ ์ˆซ์ž ๋ฐฐ์—ด์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ prefix๋ผ๋Š” ์ƒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ, prefix[i]๋Š” ์ธ๋ฑ์Šค i๊นŒ์ง€(ํ•ด๋‹น ์ธ๋ฑ์Šค ํฌํ•จ)์˜ ๋ชจ๋“  ์š”์†Œ์˜ ํ•ฉ์ด ๋˜๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, nums = [5, 2, 1, 6, 3, 8] ๊ฒฝ์šฐ, prefix = [5, 7, 8, 14, 17, 25]๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์ธ๋ฑ์Šค 0์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ๋ฐฐ์—ด์˜ โ€œ๊ตฌ๊ฐ„โ€์œผ๋กœ ๋ณธ๋‹ค. ๊ตฌ๊ฐ„ ํ•ฉ์€ ์ด๋Ÿฌํ•œ ๊ตฌ๊ฐ„๋“ค์˜ ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด ๊ตฌ๊ฐ„ ํ•ฉ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ๋„ $O(1)$ ์‹œ๊ฐ„ ๋‚ด์— ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. i๋ถ€ํ„ฐ j(ํฌํ•จ)๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๊ฒฐ๊ณผ๋Š” prefix[j] - prefix[i - 1]์ด ๋˜๋ฉฐ, i = 0์ธ ์ƒํ™ฉ์—์„œ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, prefix[j] - prefix[i] + nums[i]๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” prefix[i - 1]์ด ์ธ๋ฑ์Šค i ์ด์ „์˜ ๋ชจ๋“  ์›์†Œ๋“ค์˜ ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค j๊นŒ์ง€์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์—์„œ ์ด ๊ฐ’์„ ๋นผ๋ฉด, ์ธ๋ฑ์Šค i์—์„œ j๊นŒ์ง€์˜ ์›์†Œ๋“ค์˜ ํ•ฉ, ์ฆ‰ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” ๊ฐ’์ด ๋‚จ๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ, ํ•„์š”ํ•œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

Prefix

์œ„ ์ด๋ฏธ์ง€์—์„œ, ์šฐ๋ฆฌ๋Š” ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๊ฐ•์กฐ๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

๋ถ€๋ถ„ ๋ฐฐ์—ด ๋๊นŒ์ง€์˜ ๋ชจ๋“  ์š”์†Œ(์ดˆ๋ก์ƒ‰ ์„ )๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ๊ฒƒ ์ด์ „์˜ ๋ชจ๋“  ์š”์†Œ(๋นจ๊ฐ„์ƒ‰ ์„ )๋ฅผ ๋นผ๋ฉด ์›ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ตฌ๊ฐ„ ํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ดˆ๋ก์ƒ‰ ์„ ์˜ ํ•ฉ์ธ 25์™€ ๋นจ๊ฐ„์ƒ‰ ์„ ์˜ ํ•ฉ์ธ 11์„ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ์•ˆ์— ์ฐพ์•„, ๊ทธ ์ฐจ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์ด 14์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ๊ฐ„ ํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. ๋‹ค์Œ์€ ์˜์‚ฌ ์ฝ”๋“œ์ด๋‹ค:

1
2
3
4
5
nums๋ผ๋Š” ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ,

prefix = [nums[0]]
for (int i = 1; i < nums.length; i++)
    prefix.append(nums[i] + prefix[prefix.length - 1])

์ฒ˜์Œ์—๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋Š” ์ธ๋ฑ์Šค 1๋ถ€ํ„ฐ i๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•œ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ๊ฑด, prefix์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” ์ธ๋ฑ์Šค i๊นŒ์ง€์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ ๊ฐ’์„ ํ˜„์žฌ ๊ฐ’์— ๋”ํ•˜์—ฌ prefix์˜ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ ์š”์†Œ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ๊ฐ„ ํ•ฉ์€ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์— ์žˆ์–ด ๋งค์šฐ ์œ ์šฉํ•œ ๋„๊ตฌ์ด๋‹ค. ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์€ $O(n)$์ด์ง€๋งŒ, ์ดํ›„์˜ ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฐฐ์—ด ์กฐํšŒ๋ฅผ $O(1)$์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฏ€๋กœ, ๋ณดํ†ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ $O(n)$๋งŒํผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ $n$์€ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ค์–‘ํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์ดํ•ดํ•ด๋ณด์ž.

๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌ์ถ•์€ ์ „์ฒ˜๋ฆฌ์˜ ์ผ์ข…์ด๋‹ค. ์ „์ฒ˜๋ฆฌ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ, ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์— ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฃผ์š” ๋‹จ๊ณ„์—์„œ ํฌ๊ฒŒ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ํˆฌ์ž๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


์˜ˆ์ œ 1: ๋ถ€๋ถ„ ๋ฐฐ์—ด ํ•ฉ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ •์ˆ˜ ๋ฐฐ์—ด nums์™€ queries ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋ฉฐ, ์ด๋•Œ queries[i] = [x, y] ํ˜•ํƒœ์ด๋‹ค. ๋˜ํ•œ ์ •์ˆ˜ limit์ด ์ฃผ์–ด์ง„๋‹ค. ์ด์— ๋Œ€ํ•œ ๋‹ต์œผ๋กœ, ๊ฐ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ x๋ถ€ํ„ฐ y๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์ด limit๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ํ•ด๋‹น ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” true์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ false์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, nums = [1, 6, 3, 2, 7, 2], queries = [[0, 3], [2, 5], [2, 4]], ๊ทธ๋ฆฌ๊ณ  limit = 13์ด๋ผ๋ฉด, ๋ฐ˜ํ™˜๋˜๋Š” ๋‹ต์€ [true, false, true]์ด๋‹ค. ๊ฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์€ [12, 14, 12]์ด๋‹ค.

์ด์ œ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๊ฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋‹ต์„ $O(1)$์˜ ๋ณต์žก๋„๋กœ ์ฐพ์•„๋ณด์ž.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<bool> answerQueries(vector<int>& nums, vector<vector<int>>& queries, int limit) {
    vector<int> prefix = {nums[0]};
    for (int i = 1; i < nums.size(); i++) {
        prefix.push_back(prefix.back() + nums[i]);
    }
    
    vector<bool> ans;
    for (vector<int>& query: queries) {
        int x = query[0], y = query[1];
        int curr = prefix[y] - prefix[x] + nums[x];
        ans.push_back(curr < limit);
    }
    
    return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fn answer_queries(nums: Vec<i32>, queries: Vec<Vec<i32>>, limit: i32) -> Vec<bool> {
    let mut prefix = vec![nums[0]];
    for i in 1..nums.len() {
        let last = *prefix.last().unwrap();
        prefix.push(last + nums[i]);
    }

    let mut ans = Vec::new();
    for query in queries {
        let (x, y) = (query[0] as usize, query[1] as usize);
        let curr = prefix[y] - prefix[x] + nums[x];
        ans.push(curr < limit);
    }

    ans
}

๊ตฌ๊ฐ„ ํ•ฉ ์—†์ด ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ $O(n)$์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์—ฌ๊ธฐ์„œ $n$์€ nums์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. m = queries.length๋ผ๊ณ  ํ•  ๋•Œ, ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” $O(n*m)$์ด ๋œ๋‹ค. ๋ฐ˜๋ฉด, ๊ตฌ๊ฐ„ ํ•ฉ์„ ์ด์šฉํ•˜๋ฉด, ์ด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ $O(n)$์ด ์†Œ์š”๋˜์ง€๋งŒ ๊ฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋‹ต์€ $O(1)$๋กœ ์ค„์–ด๋“ ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ $O(n+m)$์˜ ๋” ๋‚˜์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ตฌ๊ฐ„ ํ•ฉ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” $O(n)$์ด ํ•„์š”ํ•˜๋‹ค.

์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด, ์ฃผ์–ด์ง„ limit ์กฐ๊ฑด ํ•˜์—์„œ queries์— ๋ช…์‹œ๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ๊ฐ„ ํ•ฉ์€ ์ดˆ๊ธฐ ๋ฐฐ์—ด ์„ค์ •์— ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ธด ํ•˜์ง€๋งŒ, ์ดํ›„ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ๋Œ€ํญ ์ค„์—ฌ์ค€๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.


์˜ˆ์ œ 2: ๋ฐฐ์—ด ๋ถ„ํ•  ๋ฐฉ๋ฒ•์˜ ์ˆ˜

๋ฌธ์ œ ๋งํฌ

์ •์ˆ˜ ๋ฐฐ์—ด nums๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ํ•ฉ์ด ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ํ•ฉ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ฒŒ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ฐพ์•„๋ณด์ž. ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์€ ๊ฐ ์ธ๋ฑ์Šค i์— ๋Œ€ํ•ด 0๋ถ€ํ„ฐ nums.length - 1๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ ์ธ๋ฑ์Šค์—์„œ 0๋ถ€ํ„ฐ i๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์™ผ์ชฝ ๋ถ€๋ถ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ , i + 1๋ถ€ํ„ฐ ๋ฐฐ์—ด์˜ ๋๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” $O(n^2)$์ด๋‹ค.

ํ•˜์ง€๋งŒ, ๋จผ์ € ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋ฉด ๊ฐ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ๋ฐ˜๋ณต ๊ณผ์ • ์ค‘์— ์™ผ์ชฝ ๋ฐ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์˜ ํ•ฉ์„ $O(1)$์— ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ $O(n)$์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ œ 2 ์ƒ์„ธ ์„ค๋ช…

๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด๊ฒƒ๋“ค์˜ ํ•ฉ์„ ์ฐพ์•„ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐฐ์—ด์„ ๋‚˜๋ˆ„๋Š” ๋ฐ๋Š” $n-1$๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ(์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์€ ๋น„์–ด ์žˆ์ง€ ์•Š์•„์•ผ ํ•จ), ์ด ๊ฐ๊ฐ์˜ ๋ถ„ํ• ์— ๋Œ€ํ•ด ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์‚ฌ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ทธ ํ•ฉ์„ ์ฐพ๋Š” ๋ฐ $O(n)$์ด ๊ฑธ๋ฆฐ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ถ„ํ• ์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ํ•œ ๋ฒˆ $O(n)$์„ ์†Œ๋ชจํ•˜์—ฌ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ๊ฐ์˜ $n-1$ ๋ถ„ํ• ์„ $O(1)$ ์‹œ๊ฐ„ ์•ˆ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ์•Œ๋ ค์ง„ ๋ฐ”์™€ ๊ฐ™์ด, ๊ตฌ๊ฐ„ ํ•ฉ์„ ํ™œ์šฉํ•˜๋ฉด ์–ด๋–ค ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ๋„ $O(1)$์— ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๋ฑ์Šค i์—์„œ ๋ฐฐ์—ด์„ ๋‚˜๋ˆˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์™ผ์ชฝ ๋ถ€๋ถ„์€ ์ธ๋ฑ์Šค i๊นŒ์ง€์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ prefix[i]์˜ ํ•ฉ์„ ๊ฐ–๋Š”๋‹ค. ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์€ ์ธ๋ฑ์Šค i + 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ตœ์ข… ์ธ๋ฑ์Šค n - 1์—์„œ ๋๋‚˜๋ฏ€๋กœ, prefix[n - 1]์—์„œ prefix[i]๋ฅผ ๋บ€ ๊ฐ’์ด ๊ทธ ํ•ฉ์ด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int waysToSplitArray(vector<int>& nums) {
    int n = nums.size();
    vector<long> prefix = {nums[0]};

    for (int i = 1; i < n; i++) {
        prefix.push_back(nums[i] + prefix.back());
    }

    int ans = 0;
    for (int i = 0; i < n - 1; i++) {
        long leftSection = prefix[i];
        long rightSection = prefix.back() - prefix[i];
        if (leftSection >= rightSection) {
            ans++;
        }
    }

    return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn ways_to_split_array(nums: Vec<i32>) -> i32 {
    let n = nums.len();
    let mut prefix = Vec::new();
    prefix.push(nums[0] as i64); // long

    for i in 1..n {
        prefix.push(nums[i] as i64 + prefix[i - 1]);
    }

    let mut ans = 0;
    for i in 0..n - 1 {
        let left_section = prefix[i];
        let right_section = prefix[n - 1] - prefix[i];
        if left_section >= right_section {
            ans += 1;
        }
    }

    ans
}

๋ฐฐ์—ด์ด ์ •๋ง ํ•„์š”ํ• ๊นŒ?

์ด ๋ฌธ์ œ์—์„œ๋Š” prefix์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. leftSection์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” i์— ๋Œ€ํ•ด prefix[i]๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ, leftSection์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ๋ฐฐ์—ด์€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. leftSection์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ฐ ๋ฐ˜๋ณต์—์„œ ํ˜„์žฌ ์›์†Œ๋ฅผ ๋”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฆ‰์„์—์„œ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด rightSection์€ ์–ด๋–จ๊นŒ? ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ์˜ค๋ฅธ์ชฝ ์„น์…˜์€ ์™ผ์ชฝ ์„น์…˜์— ์—†๋Š” ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ํฌํ•จํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, ์šฐ๋ฆฌ๋Š” ์ „์ฒด ์ž…๋ ฅ์˜ ํ•ฉ์„ total๋กœ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, rightSection์€ total - leftSection์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ๊ฐ„ ํ•ฉ์˜ ๊ฐœ๋…์„ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, leftSection์˜ ๊ฐ ๊ฐ’์€ ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ฐฐ์—ด์ด ์•„๋‹Œ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int waysToSplitArray(vector<int>& nums) {
    int ans = 0;
    long leftSection = 0;
    long total = 0;
    
    for (int num: nums) {
        total += num;
    }
    
    for (int i = 0; i < nums.size() - 1; i++) {
        leftSection += nums[i];
        long rightSection = total - leftSection;
        if (leftSection >= rightSection) {
            ans++;
        }
    }
    
    return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn ways_to_split_array(nums: Vec<i32>) -> i32 {
    let mut ans = 0;
    let mut left_section = 0;
    let total: i32 = nums.iter().sum();

    for i in 0..nums.len() - 1 {
        left_section += nums[i];
        let right_section = total - left_section;
        if left_section >= right_section {
            ans += 1;
        }
    }

    ans
}

์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ $O(1)$๋กœ ๊ฐœ์„ ํ•˜์˜€๊ณ , ์ด๋Š” ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋œ ๊ฒƒ์ด๋‹ค.


๋งˆ๋ฌด๋ฆฌ

๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ฃผ์š” ํŒจํ„ด์˜ ๋งˆ์ง€๋ง‰ ์ฑ•ํ„ฐ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค. ๋‹ค์Œ ๋ฌธ์„œ์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋” ์ผ๋ฐ˜์ ์ธ ํŠธ๋ฆญ๊ณผ ํŒจํ„ด์„ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

๋ณด๋„ˆ์Šค ๋ฌธ์ œ



์ถœ์ฒ˜: Leetcode

์ด ํฌ์ŠคํŠธ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY-NC-ND 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
์ตœ๊ทผ ์—…๋ฐ์ดํŠธ
์ธ๊ธฐ ํƒœ๊ทธ
๋ฐ”๋กœ๊ฐ€๊ธฐ

[DSA] ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

[DSA] ๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์˜ ์ถ”๊ฐ€์ ์ธ ํŒจํ„ด๋“ค

์ธ๊ธฐ ํƒœ๊ทธ