Algorithm, programmers, 종이접기(62049))
풀이
- 재귀 함수로 해결
- 기저사례 : 현재 접은 횟수 == 접어야 되는 횟수
- 한번 접으면
- 현재 접힌 왼쪽 부분 = 이전에 접은 부분과 같고
- 현재 접힌 오른쪽 부분 = 이전에 접은 부분과 반대
- 현재 접힌 부분의 가운데는 무조건 0
package org.programmers;
// https://www.welcomekakao.com/learn/courses/30/lessons/62049
public class witercoding_2019_origami {
public static void main(String[] args) {
//solution(3);
solution(4);
}
static int[] answer;
public static int[] solution(int n) {
int[] design = {0};
getDesign(n, 1, design);
return answer;
}
public static void getDesign(int goal, int count, int[] prevDesign) {
if (goal == count) {
makeAnswer(prevDesign);
return;
}
int[] design = new int[ prevDesign.length*2 + 1 ];
for (int i = 0; i < prevDesign.length; i++) {
// 현재 값의 오른쪽은 이전값과 같고
design[i] = prevDesign[i];
// 현재 값의 왼쪽은 이전값의 반대이다
design[ design.length -1 -i] = ( prevDesign[i] == 1) ? 0 : 1 ;
}
// 가운데 값은 무조건 0
design[ prevDesign.length / 2] = 0;
// 다 접을 때 까지 반복
getDesign( goal, count+1, design);
}
public static void makeAnswer(int[] arr) {
answer = new int[arr.length];
answer = arr.clone();
}
}
Reference