본문 바로가기
알고리즘/백준

[백준 14890] 경사로 (C++)

by Bloofer 2020. 7. 16.

A. 문제설명

https://www.acmicpc.net/problem/14890

문제에 대한 자세한 설명은 링크 참조

 

 

1. N*N 크기의 땅이 각각 높이가 다른 땅이 주어짐

2. 각각의 칸마다, 높이 1씩 차이나는 땅에 대해 경사로를 설치하려 함

3. 설치 조건은 아래와 같다.

3-1. 경사로는 낮은 칸에 놓으며, L개의 연속된 칸에 경사로의 바닥이 모두 접해야 한다.

3-2. 낮은 칸과 높은 칸의 높이 차이는 1이어야 한다.

3-3. 경사로를 놓을 낮은 칸의 높이는 모두 같아야 하고, L개의 칸이 연속되어 있어야 한다.

4. 주어진 땅에서 경사로를 놓아 길을 만들 수 있는 경우를 모두 구하라

 

B. 접근법

시뮬레이션

 

N*N 크기의 땅을 N행 + N열의 각각의 1차원 배열로 잘라내어 1차원 배열에 대해 경사로를 놓을 수 있는지 여부를 판단하여 경우의 수를 구한다.

 

C. 풀이

1. N행 + N열의 각각의 1차원 배열로 잘라내어 1차원 배열 만듦

2. 각각의 배열에 대해서 경사로 여부 파악

3. 내려가는 지형일 경우, 뒤쪽 인덱스(낮은 높이)에 경사로 설치

4. 올라가는 지형일 경우, 앞쪽 인덱스(낮은 높이)에 경사로 설치

5. 각각 앞/뒤 지형의 높이가 같으면서 경사로 설치 안되었는지 여부 확인하여 가능한 경우, 경사로 설치

6. 모든 조건 만족시 해당 배열에 대한 경우 카운트

7. 전체 경우의 수 계수

 

D. 내 코드