문제는 요기 ->https://www.acmicpc.net/problem/14890
나의 궁금증
1.왼쪽부터? 오른쪽부터..? 시작은 어디서?
2.시간을 줄일 방법이 뭘까
3.위에서 아래로가는경우, 아래서 위로가는경우, 왼쪽에서 오른쪽가는 경우, 오른쪽에서 왼쪽가는 경우
함수를 다 만들어야하는가..? 한가지 함수로 만드는 방법이 뭘까
해결방안
1.배열을 한개 더 만들어서 세로열,가로열 뒤집어서 넣기
2.왼쪽에서 오른쪽 방향으로 현재 값과 그 다음 값이 다르다
2-[1]. 현재값과 다음값의 차이가 1이 난다.
2-[1]-(1) 경사로를 어느 방향으로 놓아줄껀지 (오른쪽 방향인가 ? 왼쪽 방향인가 ?)
2-[1]-(1) .1 L길이 만큼 놓을 수 있는지 같은 값 개수 확인
-> 경사로를 놓았던 길이 아닌지 ?
2-[1]-(1) .2 경사로를 놓았던길이거나 L길이만큼 놓을 수 없다 ->종료
#include<iostream>
#include<cstring>
using namespace std;
int N, L; // 길이,경사로 길이
int ans = 0;
void func(int num,int temp[][102])
{
bool chk[102] = { 0, };
int cur = temp[num][1]; //가장 처음 값
//열 검사
for (int i = 1; i <= N; i++)
{
if (cur != temp[num][i])
{
if (abs(cur - temp[num][i]) != 1)return;
if (cur < temp[num][i]) //왼쪽 경사로 놓기
{
int data = cur;
for (int j = i - 1; j >= i - L; j--)
{
if (j < 1 || chk[j]|| (data != temp[num][j]))return;
chk[j] = true;
}
}
else//오른쪽 경사로 놓기
{
int data = temp[num][i];
for (int j = i; j<=i+L-1; j++)
{
if (j > N || chk[j] || (data != temp[num][j]))return;
chk[j] = true;
}
i = i + L - 1;
if (i >= N) break;
}
cur = temp[num][i];
}
}
ans++;
}
int main()
{
int arr[102][102]={0,};
int brr[102][102] = {0,};
scanf("%d %d", &N, &L);
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
scanf("%d", &arr[i][j]);
brr[j][i] = arr[i][j];
}
}
for (int i = 1; i <= N; i++)
{
func(i, arr);
func(i, brr);
}
printf("%d\n", ans);
}
'알고리즘문제풀이' 카테고리의 다른 글
[백준14502]연구소 (0) | 2019.02.12 |
---|---|
[백준 2151]거울설치 (0) | 2019.02.12 |
[백준14627]파닭파닭 (0) | 2018.03.02 |
[백준 14889]스타트와 링크 (0) | 2017.11.30 |
[백준 14891]톱니바퀴 (0) | 2017.11.30 |