[BAEKJOON] 백준 16504: 종이접기 (C#)

2024. 8. 19. 13:12IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/16504

 

 

문제

종이접기와 수학을 좋아하는 주성이는 종이접기와 수학을 한꺼번에 할 수 있는 놀이를 찾아냈다. 바로 N×N 크기를 가지는 색종이의 각 칸에 수를 적어놓고, 색종이를 반으로 접을 때마다 겹치는 부분의 수들을 더하는 것이다. 그리고 이 작업을 색종이를 더는 접을 수 없을 때까지 반복했을 때, 가장 마지막에 남는 수를 구하는 놀이이다.

아래의 예시는 위에서 설명한 놀이의 과정을 2×2 크기의 색종이를 사용하여 상세하게 나타낸 그림이다.

  • 색종이를 왼쪽에서 오른쪽으로 정확히 반을 접는다.
  • 겹치는 두 칸에 있는 수를 서로 더한다. 위 그림에서는 (1, 1)과 (1, 2)의 두 칸이 겹치고, (2, 1)과 (2, 2)의 두 칸도 겹치는 부분이다.
  • 더한 값을 색종이 위에 다시 적는다.
  • 색종이를 아래쪽에서 위쪽으로 정확히 반을 접는다.
  • 겹치는 두 칸에 있는 수를 서로 더한다. 위 그림에서는 (1, 1)과 (2, 1)의 두 칸이 겹치는 부분이다.
  • 더한 값을 색종이 위에 다시 적는다.

색종이를 반으로 접으면서 두꺼워지는 것을 고려하지 않고, 색종이를 더는 접을 수 없을 때까지 위 과정을 반복했을 때 가장 마지막에 남는 수를 구하여라.

 

 

입력

첫 번째 줄에는 색종이의 가로, 세로 길이를 의미하는 정수 N (N = 2m, 1 ≤ m ≤ 10)이 주어진다.

두 번째 줄부터 마지막 줄까지는 N×N 크기의 색종이 정보가 주어지며, 색종이의 각 칸에는 정수 K (1 ≤ K ≤ 100,000)가 주어진다.

 

 

출력

색종이를 반으로 접으면서 겹치는 부분의 수들을 더하는 과정을 반복했을 때, 가장 마지막에 남는 수를 출력한다.

 

 

 

통과한 답안

namespace _16504
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            long answer = 0;

            for (int i = 0; i < N; i++)
            {
                int[] numbers = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
                answer += numbers.Sum();
            }

            Console.WriteLine(answer);
        }
    }
}

 

NxN 크기의 색종이가 주어졌을 때, 왼쪽에서 오른쪽으로 반,

아래쪽에서 위쪽으로 반 접은 후에 겹치는 부분의 숫자를 더하는 과정을

색종이를 더는 접을 수 없는 상태까지 반복하였을 때, 마지막에 남는 수를 구하는 문제이다.

 

이는 다시 생각하면 N = 2^m으로 표현된 NxN의 색종이를 접기 때문에

모든 과정을 진행하였을 때 남는 색종이의 크기는 1x1이 되므로

적혀있는 모든 숫자를 더하는 것과 같은 문제이다.

 

이를 코드로 구현하면 위와 같이

입력값을 int 배열로 저장한 후에 그 배열의 합을 누적해서 더하는 것으로 해결할 수 있다.