<SW>/알고리즘 + 자료구조
[삼성SWTest준비]14890번 경사로
Hading
2018. 10. 1. 20:10
728x90
URL : https://www.acmicpc.net/problem/14890
삼성SW 기출 문제 한 번에 보기 : https://www.acmicpc.net/workbook/view/1152
※삼성 SW 역량평가 기출문제 어떻게 풀지?※
조건을 토대로 코드를 작성했던 것 같습니다.
행으로 봤을 때 3 가지 조건을 찾았습니다.
1. 옆칸이랑 같을 때
2. 클 때
3. 작을 때
※필요 역량 정리하기!!!※
1. memset 헤더는 #include<string.h> <= 이걸 안적어주면 백준에서 컴파일 에러납니다.
2. 결국, 브루트 포스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include<iostream> #include<string.h> // memset 헤더 함수 #include<algorithm> using namespace std; int n, l; int visit[101] = { 0 }; int map1[101][101] = { 0 }; int map2[101][101] = { 0 }; int cnt; void check(int row, int index, int map[101][101]) { //가로 if (index == n - 1) { cnt++; return; } if (map[row][index] == map[row][index + 1]) { check(row, index + 1, map); } // 같은 경우 else if (map[row][index] == map[row][index + 1] - 1) { if (index - l + 1 < 0) { return; } for (int i = 0; i < l; i++) { if (!visit[index - i]) { visit[index - i] = 1; } else return; }//뒤로 물러난다. check(row, index + 1, map); } // 클 경우 else if (map[row][index] == map[row][index + 1] + 1) { if (index + l > n -1) { return; } for (int i = 1; i <= l; i++) { if (!visit[index + i] && map[row][index] == map[row][index + i]+1) { visit[index + i] = 1; } else return; } check(row, index + 1, map); } // 작은 경우 } int main() { cin >> n >> l; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map1[i][j]; map2[j][i] = map1[i][j]; } } for (int i = 0; i < n; i++) { memset(visit, 0, sizeof(visit)); // 항상 memset을 해줘야 함, 한 행 한 check(i,0,map1); memset(visit, 0, sizeof(visit)); check(i, 0, map2); } cout << cnt; return 0; } | cs |
728x90