안녕하세요. 오늘은 이미지를 축소할 거예요.
https://www.acmicpc.net/problem/22994
가로로 있는 뭉탱이의 길이의 gcd값을 gcdx, 세로로 있는 뭉탱이의 길이의 gcd값을 gcdy라고 합시다. 그러면 N/gcdy,M/gcdx가 크기가 됩니다. 이걸 구해주면 됩니다.
#include <iostream>
#include <algorithm>
#include <string>
#define ll long long
using namespace std;
ll gcd(ll a,ll b) { return ((b) ? gcd(b, a % b) : a); }
int main(void)
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
string s[1010];
ll N, M, i, j, cnt, gcdx = 0, gcdy = 0;
cin >> N >> M;
for (i = 0; i < N; i++) cin >> s[i];
for (i = 0; i < N; i++)
{
cnt = 1;
for (j = 1; j < M; j++)
{
if (s[i][j] == s[i][j - 1]) cnt++;
else
{
gcdx = gcd(gcdx, cnt);
cnt = 1;
}
}
gcdx = gcd(gcdx, cnt);
}
for (j = 0; j < M; j++)
{
cnt = 1;
for (i = 1; i < N; i++)
{
if (s[i][j] == s[i - 1][j]) cnt++;
else
{
gcdy = gcd(gcdy, cnt);
cnt = 1;
}
}
gcdy = gcd(gcdy, cnt);
}
cout << N / gcdy << ' ' << M / gcdx << "\n";
for (i = 0; i < N / gcdy; i++)
{
for (j = 0; j < M / gcdx; j++)
cout << s[i * gcdy][j * gcdx];
cout << "\n";
}
}
감사합니다.