문제 설명
직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다.
먼저 오른쪽 절반을 왼쪽으로 접습니다.
다시 오른쪽 절반을 왼쪽으로 접습니다.
종이를 모두 접은 후에는 종이를 전부 펼칩니다. 종이를 펼칠 때는 종이를 접은 방법의 역순으로 펼쳐서 처음 놓여있던 때와 같은 상태가 되도록 합니다. 위와 같이 두 번 접은 후 종이를 펼치면 아래 그림과 같이 종이에 접은 흔적이 생기게 됩니다.
위 그림에서 ∨ 모양이 생긴 부분은 점선(0)으로, ∧ 모양이 생긴 부분은 실선(1)으로 표시했습니다.
종이를 접은 횟수 n이 매개변수로 주어질 때, 종이를 절반씩 n번 접은 후 모두 펼쳤을 때 생기는 접힌 부분의 모양을 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 종이를 접는 횟수 n은 1 이상 20 이하의 자연수입니다.
- 종이를 접었다 편 후 생긴 굴곡이 ∨ 모양이면 0, ∧ 모양이면 1로 나타냅니다.
- 가장 왼쪽의 굴곡 모양부터 순서대로 배열에 담아 return 해주세요.
입출력 예
n | result |
1 | [0] |
2 | [0,0,1] |
3 | [0,0,1,0,0,1,1] |
입출력 예 설명
입출력 예 #1
종이의 오른쪽 절반을 왼쪽으로 한번 접었다 펴면 아래 그림과 같이 굴곡이 생깁니다.
따라서 [0]을 return 하면 됩니다.
입출력 예 #2
문제의 예시와 같습니다.
입출력 예 #3
종이를 절반씩 세 번 접은 후 다시 펼치면 아래 그림과 같이 굴곡이 생깁니다.
따라서 [0,0,1,0,0,1,1]을 return 하면 됩니다.
처음에는 문제를 이해가 잘 되지 않아서, 종이를 실제로 접어보면서 이해를 하려고 시도하였다. 그러다보니 접는 성질에 따라 대칭의 패턴을 찾을 수 있었고, 코드로 성공적으로 구현했지만 좀 더 간결하게 구현할 수 있었는데라는 아쉬움이 남았다. 특히, 다른 사람의 풀이를 보면서 한 수 배웠다. 정직하게 풀었고, 충분히 더 좋은 코드로 구현할 수 있기에 사실 내 코드를 추천하진 않는다..! ㅠ
작성 코드
https://github.com/Sunkyoung/AlgoGo/blob/master/Programmers/folding_paper.py
def solution(n):
answer = [0]
# 그 전의 것 + 0 + 뒤집은 것
for i in range(1,n):
temp = convert(answer[::-1]) # 뒤집고 0,1 변환
answer.append(0)
answer += temp
return answer
def convert(answer):
temp = []
for a in answer :
if a == 0:
temp.append(1)
else:
temp.append(0)
return temp
'Dev > Algorithm' 카테고리의 다른 글
[프로그래머스] 정수 삼각형 문제 (Level 3) Python 풀이 (0) | 2020.03.12 |
---|---|
[프로그래머스] 가장 큰 정사각형 찾기 (Level 2) Python 풀이 (0) | 2020.03.11 |
[프로그래머스] N으로 표현 문제 (Level 3) Python 풀이 (0) | 2020.03.10 |
[알고리즘 개념] 동적 계획법 (Dynamic Programming?) (0) | 2020.03.09 |
[프로그래머스] 숫자야구 문제 (Level 2) Python 풀이 (0) | 2020.02.21 |
댓글