BOJ 10836 여왕벌


사용한 알고리즘

  • 구현

알고리즘 설명

  • 여왕벌의 크기의 초기값을 1로 모두 설정한다.
  • 왼쪽 아래부터 위쪽 오른쪽까지 애벌레이 자라는 정도를 저장한다.
  • 먼저 좌측상단 모서리 애벌레을 먼저 성장시킨다.
  • 이 성장시킨 애벌레을 기준으로 나머지 부분을 채워 나간다.
  • 결과를 출력한다.

풀이

// baekjoon 10836 yechan
#include <cstdio>
#include <algorithm>
using namespace std;
const int SIZE=1<<10;
const int MAX_M=702;

int M, N, K, board[MAX_M][MAX_M];
int arr[MAX_M];

int main() {
    scanf("%d%d", &M, &N);
// 애벌레 크기 초기 설정
    for (int i=1; i<=M; i++)
        for (int j=1; j<=M; j++)
            board[i][j] = 1;

// 2M-1개의 좌측상단 가장자리 애벌레의 성장속도를 저장한다.
// arr에 따른 애벌레의 성장속도는 아래와 같다.
// arr의 값 : 1 0 0 1 0 1 0 ...
// 성장 속도 : 1 1 1 2 2 3 3 ...
    for (int i=0; i<N; i++) {
        int pos = 1;
        for (int j=0; j<3; j++) {
            scanf("%d", &K);
            pos+=K;
            arr[pos]++;
        }
    }

// 왼쪽 위 모서리 부분의 애벌레을 모두 성장시킨다.
    int cur_x=M, cur_y=1;
    int count = 0;
    int sum = 0;
    for (int i=1; i<=2*M-1; i++) {
        sum += arr[i];
        board[cur_x][cur_y] += sum;
        if (cur_x == 1) cur_y++;
        else cur_x--;
    }

// 나머지 부분의 애벌레를 좌측과 위쪽을 보고 성장시킨다.
    for (int i=2; i<=M; i++) {
        for (int j=2; j<=M; j++) {
            board[i][j] = max(max(board[i-1][j-1], board[i][j-1]), board[i-1][j]);
        }
    }

// 결과 출력
    for (int i=1; i<=M; i++) {
        for (int j=1; j<=M; j++) {
            printf("%d ", board[i][j]);
        }
        puts("");
    }

    return 0;
}



© 2020.08. by fbdp1202

Powered by theorydb