백준[11836] - 여왕벌

문제

백준 10836 문제 보기

접근 방법

초반에 문제를 잘못 이해해 엄청 틀렸다.. 첫날부터 순서대로 입력이 되는건데 내맘대로 순서대로라는 단어를 빼고 읽었다. 문제 접근 방법은 먼저 map[1][1]을 구해야 이후의 행을 구할 수 있다.
행 하나하나를 계산하면서 진행하면 시간초과가 남으로 먼저 맨 왼쪽 행과 맨 위쪽 열만 받아 저장하고 나머지 영역은 맨 윗 열을 그대로 내리면 정답. 따지고 보면 map[1][1]를 계산할때 순서대로 입력이됨으로 결국 map[1][1]의 증가량은 map[0][1]과 같은 것!

코드

#include <iostream>
#include <cstring>

using namespace std;
int N, M;
int map[701][701];
int leftAndTop[1500];

int main() {

    cin >> M >> N;

    memset(map, 0, sizeof(map));

    for(int i = 0; i < 2*M - 1; i ++) {
        leftAndTop[i] = 1;
    }

    for(int i = 0; i < N; i ++) {
        int zero, one, two;

        cin >> zero >> one >> two;

        for(int j = zero; j < zero + one; j ++) {
            leftAndTop[j] += 1;
        }

        for(int j = zero + one; j < 2*M - 1; j ++) {
            leftAndTop[j] += 2;
        }
    }

    int r = M - 1;
    int c = 0;
    for(int i = 0; i < 2*M - 1; i ++) {

        if(r == 0) {
            map[r][c] = leftAndTop[i];
            c++;
        } else {
            map[r][c] = leftAndTop[i];
            r--;
        }
    }

    for(int i = 1; i < M; i ++) {
        int temp = map[0][i];

        for(int j = 1; j < M; j ++) {
            map[j][i] = temp;
        }
    }

    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j ++) {
            cout << map[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}
Share