문제 출처
1. 문제설명
- 종이가 어떻게 접혀있는지 문자열로 주어진다.
- 문자열의 길이는 항상 $2^n-1$ 이다.
2. 알고리즘 설계
- 문자열의 길이가 $2^n-1$인 이유는
- 한 면이
OUT
이면 반대면은 반드시 IN
이어야 한다.
3. 로직
- 길이가 홀수이므로, 중심을 정할 수 있다.
- 중심을 기준으로 좌/우가 서로 반대인지 확인
- 2개의 변수를 이용해 왼쪽은
++
, 오른쪽은 --
를 하면서 탐색
- 같아지는 지점이 있으면
false
- 시작점이 중심점보다 같거나 커질 때까지 상기 과정 반복
- 예시
- in :
1000110
- 1번째 재귀
- center : 3번째 index의 0
- 0번째 n-1번째를 각각
start
, end
로 설정
- 각 index의 값은 서로 반대
- 2번째 재귀
- center : 1번째 index의 0
- 0번째 2번째를 각각
start
, end
로 지정
- 각 index의 값은 서로 반대
- 3번째 재귀
- 2번째 재귀에서 중심의 왼쪽만 분할정복하는 이유
- 왼쪽이 제대로 되었다면, 반대쪽은 완전히 반대인 값이기 때문에
- 굳이 탐색하지 않아도 됨. (1->0, 0->1로만 바뀌기 때문)
4. 전체 코드
5. 소감
- 중심값을 기준으로 값이 반대여야 한다는 점
- 분할정복을 했을 때 중심값을 기준으로
- 한쪽 방향으로만 분할정복
- 한쪽 방향만 탐색해도 양쪽을 탐색하는 효과
- 사실 처음에 풀 때는 문자열의 길이가 짝수인지 체크
- 문제에 반드시 홀수 입력이 들어온다는 걸 간과하였음.