본문 바로가기

ALGORITHM_PRACTICE

백준 14890번: 경사로

백준 14890번: 경사로

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

단순 노가다로 풀었다. 다른 쉬운 방법이 있을 것 같지만 난 무식하게 행에 대한 연산과 열에 대한 연산을 진행했고, 조건 검사해야 하는 부분이 많아 코드가 엄청나게 길어졌다.

난 이렇게 문제를 풀었다.

 

1. 전과 같은 층일 때 같은 층 개수 카운터를 해준다.

2. 만약 다른 층일 경우 두가지를 본다

2-1. 두 층의 차가 1이 넘으면 이동할 수 없는 길이다.

2-2. 두 층의 차가 1이면 다음 3-1과 3-2를 확인한다.

3-1. 다음 층이 지금 층보다 높은가?

3-1-1. 같은 층 카운터가 사다리 길이보다 길고, 사다리 길이 만큼의 같은층에서 사다리가 이미 놓여져있는 곳이 있는가?

3-2. 다음 층이 지금 층보다 낮은가?

3-2-1. 높아야할 사다리 길이 놓는 횟수에 초기화한다.

3-2-2. 1번으로 돌아가 다시 진행하되 사다리를 놓는 횟수가 0이 아닌가?

3-2-3. 놓는 횟수가 0이 아니면 다음 진행하는 길이 전과 같은 층인가?

 

신경써야할 부분이 엄청나게 많다.

이것을 이용해 각 행의 길과 열의 길을 카운터해준다.

코드가 길어져 조금만 실수하면 틀린거 찾느라 바쁠것 같았다.

다행히 틀린거 없이 코드가 잘 이루어져 테스트케이스를 통과했다.

 

#include<iostream>
#include<cstring>
using namespace std;

int mapSize;
int arrMap[100][100];
int leader[100][100];
int answer = 0;
int leaderLength;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> mapSize >> leaderLength;
    for(int row = 0; row < mapSize; row++){
        for(int col = 0; col < mapSize; col++){
            cin >> arrMap[row][col];
        }
    }
    for(int row = 0; row < mapSize; row++){
        int first = arrMap[row][0];
        int samefloor = 1;
        int lowerfloor = 0;
        bool enableMove = true;
        for(int col = 1; col < mapSize; col++){
            // 한번 내려온 경우
            if(lowerfloor > 0){
                if(first == arrMap[row][col]){
                    lowerfloor-=1;
                    leader[row][col] = true;
                }
                else{
                    enableMove = false;
                    break;
                }
            }
            // 같은 층일 때
            if(arrMap[row][col] == first){
                samefloor += 1;
                continue;
            }
            // 다른 층일 때
            else if(arrMap[row][col] != first){
                // 차가 1이 이상이면 길이 아님
                if(abs(arrMap[row][col] - first) > 1){
                    enableMove = false;
                    break;
                }
                // 차가 1일 경우
                else{
                    // 높은 길일 경우
                    if(arrMap[row][col] - first > 0){
                        // 같은 층의 바닥 수와 놓을 수 있는 사다리 길이를 비교
                        if(samefloor >= leaderLength){
                            for(int backField = 1; backField <= leaderLength; backField++){
                                // 이미 사다리가 놓아져 있다면 길이 아니다.
                                if(leader[row][col - backField]){
                                    enableMove = false;
                                    break;
                                }
                                // 사다리를 놓는다.
                                leader[row][col - backField] = true;
                            }
                            first = arrMap[row][col];
                            //samefloor = 0;
                        } else {
                            enableMove = false;
                            break;
                        }
                    }
                    // 낮은 길일 경우
                    else{
                        lowerfloor = leaderLength - 1;
                        first = arrMap[row][col];
                        leader[row][col] = true;
                    }
                    samefloor = 1;
                    // 길이 아니라고 판단하여 해당 행을 종료
                    if(!enableMove) 
                        break;
                }
            }
        }
        if(lowerfloor != 0)
            enableMove = false;
        if(enableMove){
            answer += 1;
        }
    }
    memset(leader, false, sizeof(leader));

    for(int col = 0; col < mapSize; col++){
        int first = arrMap[0][col];
        int samefloor = 1;
        int lowerfloor = 0;
        bool enableMove = true;
        for(int row = 1; row < mapSize; row++){
            // 한번 내려온 경우
            if(lowerfloor > 0){
                if(first == arrMap[row][col]){
                    lowerfloor-=1;
                    leader[row][col] = true;
                }
                else{
                    enableMove = false;
                    break;
                }
            }
            // 같은 층일 때
            if(arrMap[row][col] == first){
                samefloor += 1;
                continue;
            }
            // 다른 층일 때
            else if(arrMap[row][col] != first){
                // 차가 1이 이상이면 길이 아님
                if(abs(arrMap[row][col] - first) > 1){
                    enableMove = false;
                    break;
                }
                // 차가 1일 경우
                else{
                    // 높은 길일 경우
                    if(arrMap[row][col] - first > 0){
                        // 같은 층의 바닥 수와 놓을 수 있는 사다리 길이를 비교
                        if(samefloor >= leaderLength){
                            for(int backField = 1; backField <= leaderLength; backField++){
                                // 이미 사다리가 놓아져 있다면 길이 아니다.
                                if(leader[row - backField][col]){
                                    enableMove = false;
                                    break;
                                }
                                // 사다리를 놓는다.
                                leader[row - backField][col] = true;
                            }
                            first = arrMap[row][col];
                            //samefloor = 0;
                        } else {
                            enableMove = false;
                            break;
                        }
                    }
                    // 낮은 길일 경우
                    else{
                        lowerfloor = leaderLength - 1;
                        first = arrMap[row][col];
                        leader[row][col] = true;
                    }
                    samefloor = 1;
                    // 길이 아니라고 판단하여 해당 행을 종료
                    if(!enableMove) 
                        break;
                }
            }
        }
        if(lowerfloor != 0)
            enableMove = false;
        if(enableMove){
            answer += 1;
        }
    }

    cout << answer;

    return 0;
}

 

'ALGORITHM_PRACTICE' 카테고리의 다른 글

[프로그래머스] 베스트앨범  (0) 2019.09.06
[프로그래머스] 타겟 넘버  (0) 2019.09.06
백준 12100번: 2048 (Easy)  (0) 2019.08.06
백준 3190번: 뱀  (0) 2019.07.15
백준 15736번: 청기 백기  (0) 2019.07.10