https://www.acmicpc.net/problem/3085
이것도 브루트 포스로 푸는 문제이다. 단순히 바꾸고 구하고를 반복해보자.
사탕의 색은 char a[51][51]로 선언해주고 이중 for문을 통해 값을 받아온다.
swap이라는 함수를 통해 두개의 색을 바꿔줄 수있도록 하였다.
바꾸고 나서 가로행과 세로행의 가장 긴 이어지는 갯수를 세어주었는데, 가로행 바꾸기와 세로행 바꾸기 똑같이 써야해서 check라는 함수로 만들어주었다.
쓰는 변수를 지역변수에서 전역변수로 바꿔주고 가로행검사, 세로행 검사 각각 따로 진행하고 그 중 가장 긴 이어지는 값을 max1에 저장해 주었다.
코드는 다음과 같다.
#include <iostream>
#include <algorithm>
using namespace std;
char a[51][51];
int max1 = 1;
int n;
void check();
int main(int argc, char* argv[])
{
cin >> n;
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
cin >> a[i][j];
}
}
for (int i = 0;i < n;i++) {
for (int j = 0;j < n - 1;j++) {
swap(a[i][j], a[i][j + 1]);
check();
swap(a[i][j], a[i][j + 1]);
}
}
for (int i = 0;i < n - 1;i++) {
for (int j = 0;j < n;j++) {
swap(a[i][j], a[i + 1][j]);
check();
swap(a[i][j], a[i + 1][j]);
}
}
cout << max1 << '\n';
return 0;
}
void check() {
char c;
//가로행 검사
for (int i = 0;i < n;i++) {
int count = 1;
c = a[i][0];
for (int j = 1;j < n;j++) {
if (c == a[i][j]) {
count++;
}
else {
count = 1;
}
c = a[i][j];
max1 = max(max1, count);
}
}
//세로행 검사
for (int i = 0;i < n;i++) {
int count = 1;
c = a[0][i];
for (int j = 1;j < n;j++) {
if (c == a[j][i]) {
count++;
}
else {
count = 1;
}
c = a[j][i];
max1 = max(max1, count);
}
}
}
그냥 무작정 다 계산해버리면 되서 편하긴하다. 하지만 손은 좀더 힘들거같다. 머리가 나쁘면 몸이 고생하는 느낌의 브루트 포스이다.
'코딩테스트 > C++' 카테고리의 다른 글
[백준 C++] 1107번: 리모컨 (0) | 2024.05.16 |
---|---|
[백준 C++] 1476번: 날짜 계산 (0) | 2024.05.14 |
[백준 C++] 2309번: 일곱 난쟁이 (0) | 2024.05.14 |
[백준 C++] 2133번: 타일 채우기 (0) | 2024.05.14 |
[백준 C++] 13398번: 연속합 2 (0) | 2024.05.13 |