본문 바로가기
알고리즘

[알고리즘] 경사로 + 활주로 건설

by keel_im 2021. 3. 24.
반응형

포인트

  • 가로 세로를 똑같은 함수를 이용하여 구한다. (사용되는 파라미터 배열 어떻게 들어가는지 볼 것)

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

c++/cpp

#include<iostream>
#include<cmath>

#define endl "\n"
#define MAX 100
using namespace std;

int n, k;
int map[MAX][MAX];
int map2[MAX][MAX];


bool canMakeRoad(int A[][MAX], int x, int y) {
    int cmp = A[x][y + 1];
    for (int j = y + 1; j < y + 1 + k; j++) {
        if (A[x][j] != cmp) return false;
    }
    return true;
}

int make(int A[][MAX]) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        bool can = true;
        int before = 1;

        for (int j = 0; j < n - 1; j++) {
            if (A[i][j] == A[i][j + 1]) before++;    // 1번 Case
            else if (A[i][j] == A[i][j + 1] + 1) { // 2번 Case 앞에것이 더 높을 때
                if (canMakeRoad(A, i, j) == true) {
                    j = j + k - 1;
                    before = 0;
                } else {
                    can = false;
                    break;
                }
            } else if (A[i][j] + 1 == A[i][j + 1]) { // 3번 Case 뒤에것이 더 높을 때
                if (before >= k) {
                    before = 1;
                } else {
                    can = false;
                    break;
                }
            } else if (abs(A[i][j] - A[i][j + 1]) >= 2) {
                can = false;
                break;
            }
        }

        if (can) total++;
    }
    return total;
}

int main(void) {

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
            map2[j][i] = map[i][j];
        }
    }

    int A = make(map);
    int B = make(map2);

    cout << A + B << endl;

    return 0;
}

python

import sys

input = sys.stdin.readline


def road(data: list, i: int) -> int:
	check = [0 for _ in range(n)]
	for j in range(n - 1):
		if abs(data[i][j] - data[i][j + 1]) > 1:
			# 1. 가로 이동 가능한지 검사한다
			# 2. 경사로를 배치했는지 검사하는 리스트 check를 만든다
			# 3. 이동할 때 다음 칸과의 차이가 1보다 크면 return한다
			return 0
		
		if data[i][j] < data[i][j + 1]:
			# 4. 오르막길일 경우 길이 l 만큼 오르막길을 배치할 수 있는지 확인한다
			temp = [0 for _ in range(n)]
			for k in range(l):
				if j - k < 0:
					return 0
				if data[i][j] != data[i][j - k] or check[j - k] != 0:
					return 0
				temp[j - k] = 1
			check = temp
		
		elif data[i][j] > data[i][j + 1]:
			temp = [0 for _ in range(n)]
			# 5. 내리막길일 경우 다음 칸 부터 시작해서 길이 l 만큼 내리막길을 배치할 수 있는지 확인한다
			for k in range(l):
				if j + k + 1 >= n:
					return 0
				if data[i][j + 1] != data[i][j + k + 1] or check[j + k + 1] != 0:
					return 0
				temp[j + k + 1] = 1
			check = temp
	return 1


# 6. 끝까지 도착하면 1을 return 경사로 개수를 증가시킨다


n, l = map(int, input().split())
data1 = [list(map(int, input().split())) for _ in range(n)]

data2 = []
for row in zip(*data1):
	data2.append(row)

answer = 0
for i in range(n):
	answer += road(data1, i)
	answer += road(data2, i)
print(answer)
반응형

'알고리즘' 카테고리의 다른 글

[알고리즘] 보물상자 비밀번호  (0) 2021.03.29
[알고리즘] 벌꿀채취  (0) 2021.03.26
[알고리즘] 벽돌 깨기  (0) 2021.03.23
[알고리즘] 이중우선순위큐  (0) 2021.03.19
[알고리즘] 베스트 앨범  (0) 2021.03.19

댓글