티스토리 뷰
백준 종이 접기 1802 python
문제 설명
문제
동호는 종이를 접는데 옆에서 보고 접으려고 한다. 옆에서 본다는 말은 아래 그림과 같이 본다는 뜻이다. 동호는 종이를 반으로 접을 때, 아래와 같이 두가지중 하나로만 접을 수 있다.
- 오른쪽 반을 반시계 방향으로 접어서 왼쪽 반의 위로 접는다.
- 오른쪽 반을 시계 방향으로 접어서 왼쪽 반의 아래로 접는다.
아래의 그림은 위의 설명을 그림으로 옮긴 것이다.
한 번의 종이 접기가 끝났을 때, 동호는 종이 접기를 원하는 만큼 더 할 수 있다. 종이 접기를 한번 접을 때 마다 두께는 2배가 되고 길이는 절반이 될 것이다.
종이 접기를 여러 번 했을 때 (안접을 수도 있다), 동호는 종이를 다시 피기로 했다. 그러고 나서 다시 접고 이렇게 놀고 있었다. 옆에서 보고 있던 원룡이는 동호를 위해 종이를 접어서 주기로 했다.(원룡이는 동호의 규칙대로 접지 않는다.) 동호는 그리고 나서 원룡이가 접었다 핀 종이를 다시 동호의 규칙대로 접을 수 있는지 궁금해졌다.
위의 저 종이를 접었다 피면 다음과 같은 그림처럼 펴진다.
종이가 시계방향으로 꺽여있으면 OUT이고, 반시계방향으로 꺾여있으면 IN이다.
종이가 접혀있는 정보가 왼쪽부터 오른쪽까지 차례대로 주어졌을 때, 이 종이를 동호의 규칙대로 접을 수 있는지 없는지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 1000보다 작거나 같은 자연수이다. 둘째 줄부터 T개의 줄에 각각의 종이가 어떻게 접혀있는지가 주어진다. 종이의 정보는 문자열로 주어지며, 1은 위의 그림에서 OUT을 의미하고 0은 위의 그림에서 IN을 의미한다. 예를 들어, 위의 그림과 같은 모양은 100으로 나타낼 수 있다. 문자열의 길이는 3000보다 작으며, 항상 2N-1꼴이다. (N ≥ 1)
출력
T개의 줄에 차례대로 각각의 종이를 동호의 방법대로 다시 접을 수 있으면 YES를, 접을 수 없으면 NO를 출력한다.
테스트케이스
3
0
000
1000110
YES
NO
YES
문제 작동원리
- 문자열의 길이는 항상 2ⁿ-1 형태이며, 중앙을 기준으로 양쪽 접힘 방향이 서로 달라야 함.
- 중앙을 기준으로 왼쪽 p번째와 오른쪽 p번째가 같으면 동호의 규칙으로 접을 수 없음.
- 위 조건을 만족하면, 왼쪽 절반과 오른쪽 절반 각각에 대해서 재귀적으로 같은 검사를 반복.
- 모든 재귀 검사에서 조건을 통과하면 YES, 하나라도 어기면 NO 출력.
전체 코드
def check(l:int,r:int,arr:list)->bool:
if(l>=r):
return True
if((r-l+1)%2==0):
return False
mid = (l+r)//2
p=1
while( mid-p>=l) and (mid+p<=r ):
if(arr[mid-p] == arr[mid+p] ):
return False
p+=1
return check(l,mid-1,arr) and check(mid+1,r,arr)
N=int(input())
for i in range(N):
arr=input()
if(check(0,len(arr)-1,arr)):
print('YES')
else:
print('NO')
'백준 스터디' 카테고리의 다른 글
백준 1459번 걷기 python (3) | 2025.08.12 |
---|---|
백준 1459 걷기 C++ (0) | 2025.08.12 |
백준 종이 접기 1802 C++ (0) | 2025.08.10 |
백준 2012번: 등수 매기기 문제 해설 (Python) (4) | 2025.08.06 |
백준 2012번: 등수 매기기 문제 해설 (C++) (1) | 2025.08.06 |
- Total
- Today
- Yesterday
- 알고리즘 문제풀이
- 그리디알고리즘
- 파이썬
- 코딩 테스트
- 알고리즘
- 알고리즘문제풀이
- 파이썬코딩
- python 알고리즘
- C++
- 코딩테스트
- 브루트포스
- 객체지향
- 알고리즘기초
- c++알고리즘
- 문자열처리
- 동적계획법
- 그리디
- 문제풀이
- 동적 계획법
- dfs
- 문제 풀이
- 프로그래밍
- C++ 알고리즘
- Python
- c언어
- 그래프 탐색
- 백준
- 코딩
- DP
- 인접 행렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |