구현문제
실전에서 나오면 백퍼 틀림 ㅋㅎㅋㅎ 괜히 골3이 아녔다.
알고리즘은 없고 구현 조건이 까다롭다.
처음에 row, col따로 함수를 만들었는데 그러지 않고 transpose를 해서 함수 하나로 돌리는게 낫다.
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i + n][j] = arr[j][i];
}
}
// 기존 배열 아래에 row-col이 뒤집힌 배열을 둔다.
그리고 연속되는 배열 길이(?)가 중요한 문제는 false인걸찾기보다
true인 경우를 찾아야한다.
즉, 배열 체크 전 디폴트를 true로 두고 false를 찾기보다
디폴트를 false로 두고 true인지 여부를 확인하는게 낫다.
그래서 solve함수에서 마지막에 true여부를 판단한다.
if (col == n - 1 && len >= 0)
sum++;
배열은 총 3가지 경우가 있다.
평행로
오르막길
내리막길
평행로의 경우엔 문제가 없다.
오르막길의 경우엔 차이가 1이어야 하며 여태 평행로의 길이가 l이상이어야 한다.
내리막길의 경우엔 앞으로 올 평행로의 길이가 l이상이어야 한다.
내리막길 확인이 조금 까다로운데 이것을 확인하기 위해 내리막길의 경우 len = -l+1로 두고 평행로의 길이가 l-1번 등장하는지 확인한다.
#include <stdio.h>
using namespace std;
int n, l;
int arr[200][100];
int solve()
{
int sum = 0;
int row, col;
for (row = 0; row < n * 2; row++)
{
int len = 1;
for (col = 0; col < n - 1; col++)
{
if (arr[row][col] == arr[row][col + 1])
{
len++;
} //오르막길
else if (arr[row][col] + 1 == arr[row][col + 1] && len >= l)
{
len = 1;
} //내리막길
else if (arr[row][col] == arr[row][col + 1] + 1 && len >= 0)
{
len = -l + 1;
}
else
break;
}
if (col == n - 1 && len >= 0)
sum++;
}
return sum;
}
int main(void)
{
scanf("%d%d", &n, &l);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i + n][j] = arr[j][i];
}
}
int result = solve();
printf("%d", result);
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 16986]인싸들의 가위바위보 (0) | 2021.03.01 |
---|---|
[백준 11652] 카드 (0) | 2021.02.25 |
[백준 15591] Moo Tube (0) | 2021.02.17 |
[백준 1339] 단어 수학 (0) | 2021.02.09 |
[백준 11723] 집합 (0) | 2021.02.06 |
댓글