

์ด ๋ฌธ์ ๋ clist ๊ธฐ์ค์ผ๋ก 2554 ๋ ์ดํ
์ ๋ฐ์ ๊ต์ฅํ ๊น๋ค๋ก์ด ๋ฌธ์ ๋ค.
ํ์ง๋ง LeetCode ์ฌ์ดํธ์ ๋ค์ด๊ฐ ๋ณด๋ฉด ๋์ด๋๊ฐ Medium์ผ๋ก ํ์๋์ด ์๋ค.
์ด ๋๋ฌธ์ ์ฒ์์ โ๊ทธ๋๋ Medium์ธ๋ฐ?โ ํ๊ณ ๋ฐฉ์ฌํ๋ค๊ฐโฆ
๋ฌด๋ ค 1์๊ฐ ๋์ ํ์ด ๋ฐฉ์๋ง ๊ณ ๋ฏผํ๋ ์ํฉ์ด ๋ฒ์ด์ก๋ค.
๋คํํ๋ ๊ฒฐ๊ตญ ๋๋ฆ ๊ฝค ์ ๋ฐํ๊ณ ๊น๋ํ ํ์ด๋ฅผ ์ฐพ์๋๊ณ ,
๋ฌธ์ ๋ฅผ ๋ค ํ๊ณ ๋ ๋ค ๋ ์ดํ
์ ํ์ธํด๋ณด๋ ์๊ฐ๋ณด๋ค ๋๋๊ฐ ๋ ๋์๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๊ณ
์คํ๋ ค ๊ธฐ๋ถ์ด ์ข์์ ธ์ ๊ธ์ ์์ฑํด ๋ณด๊ฒ ๋์๋ค. ๐

์ผ์์ผ์ ๋ง์ณค๋ค๋ฉฐ ์ถ์ ์๋ฅผ ์๋งํ๋ ๋๊ธ ๐คฃ
๋ฌธ์ ๋ ๋ค์์ ์๊ตฌํ๋ค.
์ฌ๊ธฐ์ substring์ ์ฐ์๋ ๊ตฌ๊ฐ์ ์๋ฏธํ๋ค.
๊ธธ์ด๊ฐ n์ธ ๋ฌธ์์ด์์ substring ๊ฐ์๋:
n + (n-1) + ... + 1 = (n * (n + 1)) / 2
๋ฌธ์ ์์๋ n โค 40000 ์ด๋ฏ๋ก: substring ๊ฐ์ = 800,020,000 (์ฝ 8์ต ๊ฐ)
์ฝ 8์ต ๊ฐ๋ค.
์ฆ ๋ชจ๋ substring์ ์ง์ ๋ง๋ค์ด ๊ฒ์ฌํ๋ ๋ฐฉ์์ ์ ๋ ๋ถ๊ฐ๋ฅํ๋ค.
dominant ones ์กฐ๊ฑด์ ๋ค์ ๋ณด๋ฉด,
1์ ๊ฐ์ >= (0์ ๊ฐ์)^2
์ฌ๊ธฐ์ ์ค์ํ ์ฌ์ค:
์ฆ, dominantํ substring ๋ด๋ถ์์๋, 0์ ๊ฐ์๋ ๋ง์์ผ 200๊ฐ ์ ๋๋ผ๋ ์๋ฏธ๋ค.
์ด ๊ด์ฐฐ์ด ๋ฐ๋ก ๋ฌธ์ ํด๊ฒฐ์ ๊ฒฐ์ ์ ์ธ ํฌ์ธํธ๋ค.
ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ด๋ค.
์ด ์์ ์ 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์ ๊ฐ์๊ฐ ์ ํ๋๋ค๋ ์ฌ์ค์ ์ ์ ์๊ณ ,
์ด ์ ์ ํ์ฉํ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐ ์ ๋จน์์ง๋ง, ๊ฒฐ๊ตญ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์์ด์ ๊ฐ์ธ์ ์ผ๋ก๋ ๋ง์กฑ์ค๋ฌ์ด ๋ฌธ์ ์๋ค.
Good job, matthew. ๐