๐Ÿง  Count the Number of Substrings With Dominant Ones โ€” ํ’€์ด ํ›„๊ธฐ

๊น€์žฌ์—ฐยท2025๋…„ 11์›” 15์ผ
post-thumbnail

์™œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์„ ํ•˜๋Š”๊ฐ€?

์ด ๋ฌธ์ œ๋Š” clist ๊ธฐ์ค€์œผ๋กœ 2554 ๋ ˆ์ดํŒ…์„ ๋ฐ›์€ ๊ต‰์žฅํžˆ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ๋‹ค.
ํ•˜์ง€๋งŒ LeetCode ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ๋‚œ์ด๋„๊ฐ€ Medium์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค.
์ด ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—” โ€œ๊ทธ๋ž˜๋„ Medium์ธ๋ฐ?โ€ ํ•˜๊ณ  ๋ฐฉ์‹ฌํ–ˆ๋‹ค๊ฐ€โ€ฆ
๋ฌด๋ ค 1์‹œ๊ฐ„ ๋™์•ˆ ํ’€์ด ๋ฐฉ์‹๋งŒ ๊ณ ๋ฏผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์กŒ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ๊ฒฐ๊ตญ ๋‚˜๋ฆ„ ๊ฝค ์‹ ๋ฐ•ํ•˜๊ณ  ๊น”๋”ํ•œ ํ’€์ด๋ฅผ ์ฐพ์•„๋ƒˆ๊ณ ,
๋ฌธ์ œ๋ฅผ ๋‹ค ํ’€๊ณ  ๋‚œ ๋’ค ๋ ˆ์ดํŒ…์„ ํ™•์ธํ•ด๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ๋‚œ๋„๊ฐ€ ๋” ๋†’์•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๊ณ 
์˜คํžˆ๋ ค ๊ธฐ๋ถ„์ด ์ข‹์•„์ ธ์„œ ๊ธ€์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. ๐Ÿ˜„

์ผ์š”์ผ์„ ๋ง์ณค๋‹ค๋ฉฐ ์ถœ์ œ์ž๋ฅผ ์›๋งํ•˜๋Š” ๋Œ“๊ธ€ ๐Ÿคฃ


โœจ ๋ฌธ์ œ ์š”์•ฝ ๋ฐ ํ•ต์‹ฌ ์กฐ๊ฑด

๋ฌธ์ œ๋Š” ๋‹ค์Œ์„ ์š”๊ตฌํ•œ๋‹ค.

  1. 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ๋ชจ๋“  substring์„ ๊ณ ๋ คํ•œ๋‹ค.
  2. ๊ทธ ์ค‘ dominant ones ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” substring์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋ฉด ๋œ๋‹ค.
  3. dominant ones๋ž€,1์˜ ๊ฐœ์ˆ˜ โ‰ฅ (0์˜ ๊ฐœ์ˆ˜)^2 ์„ ๋งŒ์กฑํ•˜๋Š” substring์ด๋‹ค.

์—ฌ๊ธฐ์„œ substring์€ ์—ฐ์†๋œ ๊ตฌ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.


โ— ๋‹จ์ˆœํ•œ ์™„์ „ ํƒ์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ด์œ 

๊ธธ์ด๊ฐ€ n์ธ ๋ฌธ์ž์—ด์—์„œ substring ๊ฐœ์ˆ˜๋Š”:

n + (n-1) + ... + 1 = (n * (n + 1)) / 2

๋ฌธ์ œ์—์„œ๋Š” n โ‰ค 40000 ์ด๋ฏ€๋กœ: substring ๊ฐœ์ˆ˜ = 800,020,000 (์•ฝ 8์–ต ๊ฐœ)

์•ฝ 8์–ต ๊ฐœ๋‹ค.

์ฆ‰ ๋ชจ๋“  substring์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹์€ ์ ˆ๋Œ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ’ก ํ•ต์‹ฌ ์•„์ด๋””์–ด โ€” โ€œ0โ€์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐ์ •ํ•œ๋‹ค

dominant ones ์กฐ๊ฑด์„ ๋‹ค์‹œ ๋ณด๋ฉด,

1์˜ ๊ฐœ์ˆ˜ >= (0์˜ ๊ฐœ์ˆ˜)^2

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์‚ฌ์‹ค:

  • ๋ฌธ์ž์—ด์— 0์ด 200๊ฐœ๋งŒ ์žˆ์–ด๋„ (200)^2 = 40000 ์ฆ‰, ๋ฌธ์ž์—ด ์ „์ฒด ๊ธธ์ด์˜ ์ตœ๋Œ€์น˜์— ๋„๋‹ฌํ•œ๋‹ค.
  • 0์ด 200๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์ˆœ๊ฐ„, ์–ด๋–ค substring์„ ๋งŒ๋“ค์–ด๋„ 1์ด ๊ทธ๋งŒํผ ๋งŽ์•„์งˆ ์ˆ˜ ์—†๋‹ค.

์ฆ‰, dominantํ•œ substring ๋‚ด๋ถ€์—์„œ๋Š”, 0์˜ ๊ฐœ์ˆ˜๋Š” ๋งŽ์•„์•ผ 200๊ฐœ ์ •๋„๋ผ๋Š” ์˜๋ฏธ๋‹ค.

์ด ๊ด€์ฐฐ์ด ๋ฐ”๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ๊ฒฐ์ •์ ์ธ ํฌ์ธํŠธ๋‹ค.


๐Ÿ› ๏ธ ๊ตฌ์ฒด์ ์ธ ํ’€์ด ๋ฐฉ์‹

ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์ด๋‹ค.

1. ๋ฌธ์ž์—ด์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ํ•œ ๊ธ€์ž์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

  • ์ด ๋•Œ, ๋“ฑ์žฅํ•œ ๋ชจ๋“  0์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค.

2. ํ˜„์žฌ ์ธ๋ฑ์Šค i์—์„œ ๋๋‚˜๋Š” substring๋งŒ ์ƒ๊ฐํ•œ๋‹ค.

  • ์™œ๋ƒ๋ฉด โ€œ์–ด๋””์„œ ์‹œ์ž‘ํ•ด์„œ i์—์„œ ๋๋‚˜๋Š” substring๋“คโ€์„ ์„ธ๋ฉด ์ „์ฒด substring์„ ๋ชจ๋‘ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. i์—์„œ๋ถ€ํ„ฐ ๊ฑฐ๊พธ๋กœ 0์˜ ์œ„์น˜๋“ค์„ ํƒ์ƒ‰ํ•œ๋‹ค.

  • ๋‹จ, dominantํ•œ substring์€ 0์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์•ผ 200๊ฐœ ์ •๋„์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋งค ์œ„์น˜ i์—์„œ ์ตœ๋Œ€ 200๊ฐœ์˜ 0๋งŒ ๊ฑฐ๊พธ๋กœ ํ™•์ธํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.
  • ์ด๊ฒƒ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(n ร— 200) = O(n)์œผ๋กœ ๋งŒ๋“ ๋‹ค.

4. 0์„ ํ•˜๋‚˜์”ฉ ํ™•์žฅํ•˜๋ฉฐ dominant ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” substring ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

  • ํ˜„์žฌ ๊ณ ๋ ค ์ค‘์ธ ๋‘ 0 ์‚ฌ์ด์—๋Š” ์—ฐ์†๋œ 1๋“ค์ด ์žˆ๋‹ค.
  • ์ด 1 ๋ฉ์–ด๋ฆฌ์˜ ๊ธธ์ด๋ฅผ ์ด์šฉํ•ด โ€œ์‹œ์ž‘์ ์„ ์–ด๋””๊นŒ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?โ€๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ์ „์ฒด substring์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐœ์ˆ˜๋งŒ ์ˆ˜ํ•™์ ์œผ๋กœ ์„ธ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด ์ž‘์—…์„ i = 0๋ถ€ํ„ฐ n-1๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.


๐Ÿ” ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„

dominant substring์—์„œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” 0์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•ฝ sqrt(n)์ด๋ฏ€๋กœ: O(n * sqrt(n))

๋ฌธ์ œ์˜ ์กฐ๊ฑด(n โ‰ค 40000)์—์„œ๋Š” ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋‹ค.


โœ… ์ „์ฒด ์ฝ”๋“œ

class Solution {
public:
    typedef vector<int>vi;
    typedef vector<vi>vii;
    int numberOfSubstrings(string s) {
        vi z;
        int n=s.size();
        int answer=0;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                z.push_back(i);
            }
            
            int zeroCount=0;
            int oneCount=0;
            int lastIndex=i+1;

            for(int j=(int)z.size()-1;0<=j;j--){
                int pre=pow(zeroCount,2);
                int now=pow(++zeroCount,2);
                
                int between=lastIndex-z[j]-1;
                oneCount+=between;
                int diff=max(0,oneCount-pre+1);
                answer+=min(between,diff);

                if(oneCount>=now){
                    answer++;
                }
                
                lastIndex=z[j];
            
                if(now>i+1){
                    break;
                }
            }

            int pre=pow(zeroCount,2);
            int between=lastIndex;
            oneCount+=between;
            int diff=max(0,oneCount-pre+1);
            answer+=min(between,diff);
        }
        
        return answer;
    }
};

๐Ÿ ๋งˆ๋ฌด๋ฆฌ

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ์กฐ๊ฑด๋งŒ ๋ณด๋ฉด ํ‰๋ฒ”ํ•ด ๋ณด์ด์ง€๋งŒ,
substring์ด ์›Œ๋‚™ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— โ€œ์ง์ ‘ ์„ธ์ง€ ์•Š๋Š” ๋ฐฉ์‹โ€์„ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ณ ๋‚œ๋„ ๋ฌธ์ œ๋‹ค.

ํ•˜์ง€๋งŒ dominant ones๋ผ๋Š” ์กฐ๊ฑด์„ ์ž˜ ๋ณด๋ฉด
ํ•„์—ฐ์ ์œผ๋กœ 0์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ œํ•œ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๊ณ ,
์ด ์ ์„ ํ™œ์šฉํ•˜๋ฉด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐ ์• ๋จน์—ˆ์ง€๋งŒ, ๊ฒฐ๊ตญ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฐœ์ธ์ ์œผ๋กœ๋„ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋ฌธ์ œ์˜€๋‹ค.

profile
๋Š์ž„์—†์ด '์„ฑ์žฅ'ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๊น€์žฌ์—ฐ์ž…๋‹ˆ๋‹ค.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 11์›” 15์ผ

Good job, matthew. ๐Ÿ‘

1๊ฐœ์˜ ๋‹ต๊ธ€