[백준 2903] 중앙 이동 알고리즘 (C++, C#) - soo:bak
작성일 :
문제 링크
설명
정사각형 점 4개
에서 시작하여, 중앙과 변 중간에 점을 추가하는 방식으로 점의 수를 확장하는 문제입니다.
점의 추가 방식은 다음과 같습니다:
- 각 변의 중간에 점을 하나씩 추가하여, 변의 개수를 두 배로 만듭니다.
- 중심에도 점을 하나 추가하므로, 전체적으로 정사각형 안의 격자 수가 커지는 구조입니다.
이 과정을 N
번 반복했을 때 최종적으로 생기는 점의 총 개수를 구해야 합니다.
접근법
처음 상태에서 한 변에는 점이 2
개 존재합니다.
이후 매 반복마다 각 변의 점 개수가 다음과 같이 증가합니다:
- 한 번 반복할 때마다, 기존 각 구간의 중간 지점에 점이 추가되므로 길이가 두 배가 됩니다.
- 따라서
i
번째 단계에서 한 변에 있는 점의 수는 다음과 같은 등비 수열을 따릅니다:
이는 결국 다음과 같이 정리됩니다:
따라서, 최종 점의 개수는 다음과 같이 계산할 수 있습니다:
이 수식을 직접 구현하면, 반복문의 사용 없이도 효율적으로 정답을 구할 수 있습니다.
Code
C#
1
2
3
4
5
6
7
8
9
namespace Solution {
class Program {
static void Main(string[] args) {
int n = int.Parse(Console.ReadLine());
var result = (int)Math.Pow(Math.Pow(2, n) + 1, 2);
Console.WriteLine(result);
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
cout << (int)pow((pow(2, n) + 1), 2) << "\n";
return 0;
}