Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 순열
- 백트래킹
- 메모리풀
- 비트마스크
- 큐
- 클래스
- 문자열
- DP
- MST
- 이분 탐색
- 완전 탐색
- 우선순위 큐
- lis
- 스택
- 중복 순열
- Knapsack
- dfs
- 시뮬레이션
- BeautifulSoup
- 크루스칼
- 빠른 입출력
- SSAFY
- 조합
- 링크드리스트
- 피보나치 수
- 분할 정복
- 세그먼트 트리
- 그리디
- 재귀
- BFS
Archives
- Today
- Total
작심 24/7
[프로그래머스] 종이접기 Summer/Winter Coding(2019) 본문
코딩테스트 연습 - 종이접기
직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다. 먼저 오른쪽 절반을 왼쪽으로 접습니다. 다시 오른쪽 절반을 왼쪽��
programmers.co.kr
종이를 같은 방향으로 n번 접었다 펼쳤을 때 생기는 굴곡이 v 모양이면 0, ∧ 모양이면 1을 출력해야 한다.
규칙을 찾기 위해 종이를 직접 5번까지 접어보니 패턴이 나왔다.
N Result
1 0
2 0 0 1
3 0 0 1 0 0 1 1
4 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1
5 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1
... ...
색으로 표시한 부분을 보면 N-1의 결과가 N의 파란 부분이 되고
중간의 0을 기준으로 빨간 부분과 대칭을 이루고 있다는 것을 알 수 있다.
따라서 배열을 만들어 2부터 n까지 차근차근 구해 값을 집어넣고 문제가 원하는 answer 벡터에 할당해주면 끝
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int arr[1111111] = { 0 };
vector<int> solution(int n) {
vector<int> answer;
for (int i = 2; i <= n; i++) {
int a = 0;
for (int j = pow(2, i) - 2; j >= pow(2, i - 1); j--) {
if (arr[a] == 0)arr[j] = 1;
a++;
}
}
for (int i = 0; i<pow(2, n) - 1; i++) answer.push_back(arr[i]);
return answer;
}
Comments