문제 설명
직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다.
먼저 오른쪽 절반을 왼쪽으로 접습니다.
다시 오른쪽 절반을 왼쪽으로 접습니다.
종이를 모두 접은 후에는 종이를 전부 펼칩니다. 종이를 펼칠 때는 종이를 접은 방법의 역순으로 펼쳐서 처음 놓여있던 때와 같은 상태가 되도록 합니다. 위와 같이 두 번 접은 후 종이를 펼치면 아래 그림과 같이 종이에 접은 흔적이 생기게 됩니다.
위 그림에서 ∨ 모양이 생긴 부분은 점선(0)으로, ∧ 모양이 생긴 부분은 실선(1)으로 표시했습니다.
종이를 접은 횟수 n이 매개변수로 주어질 때, 종이를 절반씩 n번 접은 후 모두 펼쳤을 때 생기는 접힌 부분의 모양을 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 종이를 접는 횟수 n은 1 이상 20 이하의 자연수입니다.
- 종이를 접었다 편 후 생긴 굴곡이 ∨ 모양이면 0, ∧ 모양이면 1로 나타냅니다.
- 가장 왼쪽의 굴곡 모양부터 순서대로 배열에 담아 return 해주세요.
문제 풀이
종이 접기의 핵심은 이진트리로 한 번 접을 때마다 말단의 노드에서 각각 0,1을 가진 노드를 추가해주면 된다. 또한 접은 결과물을 출력할 때는 트리를 중위 순회하여 노드의 숫자를 출력하면 된다.
using System;
using System.Collections.Generic;
public class BinaryTreeNode<T>
{
public T Data { get; set; }
public BinaryTreeNode<T> Left { get; set; }
public BinaryTreeNode<T> Right { get; set; }
public BinaryTreeNode(T data)
{
this.Data = data;
}
}
// 이진 트리 클래스
public class BinaryTree<T>
{
public BinaryTreeNode<T> Root { get; set; }
// 트리 데이터 출력 예
public void InOrderTraversal(BinaryTreeNode<int> node, List<int> list)
{
if (node == null)
{
return;
}
InOrderTraversal(node.Left, list);
list.Add(node.Data);
//Console.WriteLine(node.Data);
InOrderTraversal(node.Right,list );
}
public void NodeAdd(BinaryTreeNode<int> node, int count, int limit)
{
if(limit == count)
{
return;
}
else
{
count++;
node.Left = new BinaryTreeNode<int>(0);
NodeAdd(node.Left, count, limit);
node.Right = new BinaryTreeNode<int>(1);
NodeAdd(node.Right, count, limit);
}
}
}
public class Solution {
public int[] solution(int n) {
int[] answer = new int[] {};
BinaryTree<int> btree = new BinaryTree<int>();
btree.Root = new BinaryTreeNode<int>(0);
btree.NodeAdd(btree.Root, 1, n);
List<int> list = new List<int>();
btree.InOrderTraversal(btree.Root, list);
answer = list.ToArray();
return answer;
}
}
https://programmers.co.kr/learn/courses/30/lessons/62049
코딩테스트 연습 - 종이접기
직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다. 먼저 오른쪽 절반을 왼쪽으로 접습니다. 다시 오른쪽 절반을 왼쪽��
programmers.co.kr
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
기능개발(레벨2, C#) (1) | 2021.11.30 |
---|---|
K번째수(레벨1, C#) (0) | 2021.11.29 |
숫자 문자열과 영단어(레벨1, C#) (0) | 2021.11.26 |
조이스틱(레벨2, C#) (0) | 2020.07.22 |
섬 연결하기(레벨 3, C#) (0) | 2020.07.22 |