일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 따라하기
- 연산자 끼워넣기
- 괄호추가하기
- 미세먼지 안녕!
- Java
- 1182
- 17472
- 인스타
- 16637
- 알고리즘
- 좋아요
- 14888
- 6603
- 17136
- 인스타그램
- 재귀
- 17143
- 색종이 붙이기
- 부분수열의 합
- 14502
- django
- 장고
- 17144
- 다리 만들기2
- 구슬탈출2
- 로또
- 9095
- 백준
- 댓글
- Ajax
- Today
- Total
Be a developer
백준 14890 경사로 본문
일단 문제가 길어서 좀 잘렸다..
처음 봤을 때 좀 복잡하겠다 싶었는데, 문제 자체가 어렵다기 보다는 index를 가지고 노는 것이 힘들었던 문제였다.
문제를 읽고 이해가 안되었던 부분도 있었고.. 그래서 힘들었던 것 같다.
결국 index 때문에 정신이 혼란해서 강의를 보고 풀게 되었다..
1. 먼저 잘못한 것은 경사로를 놓을 수 있는지 check할 때, i와 i+1 두 인덱스를 가지고 검사하려다 보니, 한 칸씩 검사를 하면 되는 것을 두 칸씩 검사하여 코드도 복잡해지고 내 머리속도 복잡해졌다..
어떤 인덱스를 기준으로 왼쪽으로 더 가거나 오른쪽으로 더 갈 때 i-j, i+j와 같이 푸는 방법을 잘 기억해둬야겠다.
2. 길을 찾기 위해서는 행이든 열이든 한 줄씩만 검사하면 된다. 처음에 그렇게 풀려고 했으나, 어떻게 해야 될지 잘 떠오르지 않았고, 시간이 지나다 보니 그냥 2차원 배열 자체로 검사하게 되었다. 당연히 코드가 복잡해졌다.
강의를 듣고 보니, vector를 선언하여, 그 안에 한 줄씩 넣고, 이를 인자로 전달하면 되었다.
이러한 풀이법도 머리에 잘 넣어둬야 겠다..
3. 주의할 점이 있었다. 이미 경사로가 있거나, 높이가 안맞거나, 범위를 벗어나는 경우 길이 될 수 없다는 조건이 존재한다. 이 때 범위를 벗어나는 경우를 먼저 처리해 주어야 뒤에서 runtime error가 발생하지 않으므로, 범위를 벗어나는 조건을 먼저 제외시켜주자.
결론적으로 아직 index를 가지고 노는 것이 힘든 것 같다. index를 다룰 때 좀 더 신경써서 생각을 한 다음 코딩을 해야겠다.
코드는 아래와 같다.
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 68 69 70 71 72 73 74 75 76 77 | #include <iostream> #include <algorithm> #include <cstring> #include <vector> using namespace std; int n, l; int map[100][100]; bool check(vector<int> &d) { //중복 안되도록 체크하는 배열 bool c[100]; memset(c, false, sizeof(c)); //오른쪽으로 쭉 가면서 검사한다. for (int i = 1; i < n; i++) { //차이가 1이상이면 false int diff = abs(d[i] - d[i - 1]); if (diff > 1)return false; //1차이면 어디가 높은 쪽인지 체크한다. if (diff == 1) { //높아질 때 if (d[i] > d[i - 1]) { //l만큼 가서 계속 높이가 같은지 본다. for (int j = 1; j <= l; j++) { //범위 벗어나면 못 놓는다.(항상 범위를 벗어나는 것을 먼저 제외시켜 줘야 runtime error가 발생하지 않는다. 조심하자) if (i - j < 0)return false; //높이가 다르면 경사로 못 놓는다. i-1를 기준으로 해서 높이가 다른지만 체크하면 된다. 왼쪽으로 이동하면서 2칸씩 비교할 필요가 없다. if (d[i - 1] != d[i - j]) return false; //이미 놓여있으면 못 놓는다. if (c[i - j])return false; c[i - j] = true; } }//높아질 때 else { for (int j = 0; j < l; j++) { if (i + j >= n)return false; if (d[i] != d[i + j]) return false; if (c[i + j])return false; c[i + j] = true; } } } } return true; } int main(int argc, char** argv) { int ans = 0; cin >> n >> l; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &map[i][j]); } } //행 먼저 검사 for (int i = 0; i < n; i++) { vector<int>d; for (int j = 0; j < n; j++){ d.push_back(map[i][j]); } if (check(d))ans++; } //열 검사 for (int i = 0; i < n; i++) { vector<int>d; for (int j = 0; j < n; j++) { d.push_back(map[j][i]); } if (check(d))ans++; } printf("%d\n", ans); return 0; } | cs |
'sw 역량테스트' 카테고리의 다른 글
백준 13460 구슬 탈출2 (2) | 2019.08.13 |
---|---|
백준 3190 뱀 (0) | 2019.04.24 |
백준 14503 로봇 청소기 (0) | 2019.04.16 |
백준 14889 스타트와 링크 (0) | 2019.04.13 |
백준 14891 톱니바퀴 (0) | 2019.04.12 |