https://www.acmicpc.net/problem/20187
k=int(input())
paper=[[0]*2 for _ in range(2)]
opers=list(input().split())
h=int(input())
paper[h//2][h%2]=1
for oper in opers[::-1]:
if oper=='R' or oper=='L':
paperReverse=[[0]*len(paper[0]) for _ in range(len(paper))]
for i in range(len(paper)):
for j in range(len(paper[0])):
paperReverse[i][len(paper[0])-1-j]=paper[i][j]
if oper=='R':
for i in range(len(paper)):
paper[i]=paperReverse[i]+paper[i]
else:
for i in range(len(paper)):
paper[i]+=paperReverse[i]
else:
paperReverse=[[0]*len(paper[0]) for _ in range(len(paper))]
for i in range(len(paper)):
for j in range(len(paper[0])):
paperReverse[len(paper)-1-i][j]=paper[i][j]
if oper=='U':
paper+=paperReverse
else:
paper=paperReverse+paper
for i in range(0,2**k*2,2):
for j in range(0,2**k*2,2):
if paper[i][j]==1:
print(0,end=' ')
elif paper[i][j+1]==1:
print(1,end=' ')
elif paper[i+1][j]==1:
print(2,end=' ')
elif paper[i+1][j+1]==1:
print(3,end=' ')
print()
종이를 접어서 한 구석에 구멍을 뚫었을 때, 이를 펼쳤을 때, 구멍의 위치들이 어떻게 되는지 출력하는 문제이다. 분할정복인줄 알았는데 구현문제였다.
단순히 구멍을 뚫은 종이를 맨 처음에 2x2 배열로 표현한다. 구멍이 있는 부분만 1로 표현하고 나머지는 0으로 표시한다. 이 때, 펼치는 순서는 접은 순서의 반대이므로 역으로 명령을 받은 것을 받아서 펼치면 된다. 왼쪽과 오른쪽으로 펼치는 것과 위쪽과 아랫쪽으로 펼치는 모양이 똑같기 때문에 똑같은 모양으로 펼치고 이어붙이는 위치만 조절해주면 된다.
출력 시에는 구멍이 어디에 있는지를 알기 위해 2x2 씩 읽어서 출력해야 하므로 2칸씩 읽는다. 이 때, 종이의 크기는 가 된다.
이렇게 Python으로 백준의 "종이접기" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊