2024. 8. 19. 13:12ㆍIT/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 배열로 저장한 후에 그 배열의 합을 누적해서 더하는 것으로 해결할 수 있다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 31789: 모험의 시작 (C#) (0) | 2024.08.20 |
---|---|
[BAEKJOON] 백준 16503: 괄호 없는 사칙연산 (C#) (0) | 2024.08.19 |
[BAEKJOON] 백준 16673: 고려대학교에는 공식 와인이 있다 (C#) (0) | 2024.08.19 |
[BAEKJOON] 백준 15923: 욱제는 건축왕이야!! (C#) (0) | 2024.08.19 |
[BAEKJOON] 백준 1459: 걷기 (C#) (0) | 2024.08.18 |