일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 문제풀이
- 14890
- 팰린드롬수
- 14891
- 백트래킹
- 1259
- 14501
- 테트로미노
- rustup
- 14888
- 15651
- C++
- rust설치
- 13460
- 14503
- 15650
- 3190
- 10872
- 15649
- 연산자 끼워넣기 성공
- 백준
- 분해합
- 9663
- C
- 14500
- 15683
- 15652
- 2798
- 러스트란 #cargo
- 13458
Archives
Easy-So-Easy
[백준] 14890번 경사로 - C/C++ (Easy 풀이) 본문
반응형
백준 14890 문제(Problem)
풀이 & 전체 코드(Solution & Code)
#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
int n, l, map[101][101], cnt, visited[101][101];
// 세로 방향(열)의 경로의 유효성을 확인하는 함수
int check_1(int x) {
for(int i=0; i<n-1; i++) {
int k = map[i][x] - map[i+1][x];
// 높이 차이가 1이상이면 0 반환
if(k != 1 && k != 0 && k != -1) return 0;
// 경사를 아래로 향하게 놓는 경우
if(k == 1) {
i++;
visited[i][x] = 1;
for(int j=1; j<l; j++) {
if(map[i][x] != map[i+1][x]) return 0;
i++;
if(i >= n) return 0;
// 다리 놓은 곳에 방문 표시
visited[i][x] = 1;
}
i--;
}
}
// 반대편에서 다시 경사가 아래로 향하게 다리 놓기 시작
for(int i=n-1; i>0; i--) {
int k = map[i][x] - map[i-1][x];
// 높이 차이가 1이상이면 0 반환
if(k != 1 && k != 0 && k != -1) return 0;
// 경사를 아래로 향하게 놓는 경우
if(k == 1) {
i--;
// 이미 방문했으면 0 반환
if(visited[i][x]) return 0;
for(int j=1; j<l; j++) {
if(map[i][x] != map[i-1][x]) return 0;
i--;
if(visited[i][x]) return 0;
if(i < 0) return 0;
}
i++;
}
}
return 1;
}
// 가로 방향(행)의 경로의 유효성을 확인하는 함수
int check_2(int y) {
for(int i=0; i<n-1; i++) {
int k = map[y][i] - map[y][i+1];
// 높이 차이가 1이상이면 0 반환
if(k != 1 && k != 0 && k != -1) return 0;
// 경사를 아래로 향하게 놓는 경우
if(k == 1) {
i++;
visited[y][i] = 1;
for(int j=1; j<l; j++) {
if(map[y][i] != map[y][i+1]) return 0;
i++;
if(i >= n) return 0;
visited[y][i] = 1;
}
i--;
}
}
// 반대편에서 다시 경사가 아래로 향하게 다리 놓기 시작
for(int i=n-1; i>0; i--) {
int k = map[y][i] - map[y][i-1];
// 높이 차이가 1이상이면 0 반환
if(k != 1 && k != 0 && k != -1) return 0;
// 경사를 아래로 향하게 놓는 경우
if(k == 1) {
i--;
if(visited[y][i]) return 0;
for(int j=1; j<l; j++) {
if(map[y][i] != map[y][i-1]) return 0;
i--;
if(visited[y][i]) return 0;
if(i < 0) return 0;
}
i++;
}
}
return 1;
}
int main() {
cin >> n >> l;
// 지도의 높이를 입력받음
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin >> map[i][j];
}
}
// 유효한 경로의 개수를 계산
for(int i=0; i<n; i++) {
cnt += check_1(i);
}
memset(visited, 0, sizeof(visited));
for(int i=0; i<n; i++) {
cnt += check_2(i);
}
cout << cnt;
}
반응형
'BaekJoon' 카테고리의 다른 글
[백준] 15683번 감시 - C/C++ (0) | 2023.07.20 |
---|---|
[백준] 14891번 톱니바퀴 - C/C++ (Easy 풀이) (0) | 2023.07.13 |
[백준] 14503번 로봇 청소기 - C/C++ (Easy 풀이) (0) | 2023.07.06 |
[백준] 14501번 퇴사 - C/C++ (Easy 풀이) (0) | 2023.07.06 |
[백준] 14500번 테트로미노 - C/C++ (Easy 풀이) (0) | 2023.07.06 |