본문 바로가기

알고리즘문제풀이

[백준 14890]경사로

반응형

문제는 요기 ->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