ALGOSPOT - ZEROONE
알고리즘/구현문제
https://algospot.com/judge/problem/read/ZEROONE
풀이
그냥 문제대로 구현하면 푸는 문제인줄 알고 풀었다가 엄청 많이 틀렸다. 문자열의 최대 길이가 L이라했을때 별 다른 방법 없이 코드를 작성하면 전체 수행시간이 $O(NL)$이라 시간 초과가 나게 된다. 그러므로 수행 시간의 상한을 $O(N * lg(L))$ 정도라 생각하고 풀어야 한다.
수열의 값은 0과 1밖에 없고 최대값과 최소값이 같다는 뜻은 해당 구간 i,j의 모든 원소가 같다는 뜻이므로 구간마다 그룹을 나누어 배열에 저장하면 전체 수행 시간을 $O(N)$으로 줄일 수 있다.
예를들어 수열 000110010가 있다 할때 그룹화하여 000112234로 저장한뒤 그룹 배열의 i와 j번째 값이 같은지만 비교해주면 되기 때문이다.
#include <stdio.h> int main() { int t,i,j,tmp; int diff[1000001]={0}; char s[1000001]; scanf("%s",s); for(i=1;s[i]!='\0';i++){ diff[i] = diff[i-1]; if(s[i-1] != s[i]) diff[i]++; } scanf("%d",&t); while(t--){ scanf("%d%d",&i,&j); printf("%s\n",diff[i] == diff[j]?"Yes":"No"); } return 0; }