-
백준(BOJ) 14890번 경사로알고리즘 풀이/백준(Boj) 2019. 11. 16. 04:25
문제 : https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
풀이 :
단순히 문제에 주어진 대로 따라하는 시뮬레이션 문제였다. 행과 열을 한줄씩 담아서
경사로를 확인하는 함수에 넣어서 처리하자. 조건들을 주의하면서 푼다면 무리없이 풀 수 있었다.
자세한 것은 주석을 확인
코드 ( C++ )
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <iostream> #include <vector> using namespace std; int n, l; int board[100][100]; bool canGo(vector<int>& v) { vector<bool> visited(n, false); for (int i = 1; i < n; ++i) { if (v[i - 1] != v[i]) { int diff = abs(v[i] - v[i - 1]); // 차이가 1이상 날때 if (diff != 1) return false; // 더 높을때 if (v[i - 1] < v[i]) { for (int j = 1; j <= l; ++j) { //경사로 범위 벗어날 때 if (i - j < 0) return false; // 평평하지 않을때 if (v[i - 1] != v[i - j]) return false; // 놓은 곳에 또 경사로를 놓을 때 if (visited[i - j]) { return false; } //경사로를 놓은다. visited[i - j] = true; } } // 더 낮을때 else { for (int j = 0; j < l; ++j) { if (i + j >= n) return false; if (v[i] != v[i + j]) return false; if (visited[i + j]) return false; visited[i + j] = true; } } } } return true; } int main() { cin >> n >> l; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) cin >> board[i][j]; int ret = 0; //행부터 계산 for (int i = 0; i < n; ++i) { vector<int> row; for (int j = 0; j < n; ++j) { row.push_back(board[i][j]); } if (canGo(row)) { ret++; } } for (int j = 0; j < n; ++j) { vector<int> col; for (int i = 0; i < n; ++i) { col.push_back(board[i][j]); } if (canGo(col)) { ret++; } } cout << ret << "\n"; return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 16985번 - Maaaaaaaaaze (0) 2019.11.25 백준(BOJ) 16234번 인구 이동 (0) 2019.11.22 백준(BOJ) 17135번 캐슬 디펜스 (0) 2019.11.13 백준(BOJ) 16948번 데스 나이트 (0) 2019.11.07 백준(BOJ) 16926번 배열 돌리기 1 (0) 2019.11.04