Algorithm

[소프티어/Softeer] 나무 공격 C++

SoyeonCha 2024. 11. 1. 10:06

문제 링크 : https://softeer.ai/practice/9657

 

틀린 코드

- 시간 초과 떴음. for문 범위를 잘못 설정했음. 배열의 인덱스(0,1,2,...)와 번째 수(1,2,3,...)가 다르다는 거를 유의할 것.

- 환경 파괴범의 위치를 2차원 배열에 굳이 다 저장할 필요 없고, 각 행에 몇 명 있는지만 저장하면 됨. g[n][m] 없애고 arr[n] 사용하도록 코드 고쳤음.

- 숲의 요정이 지나가는 행에 있는 환경 파괴범의 인원이 1명 이상이라면 그 행들의 인원 수만 1씩 줄이면 됨. 공격이 두 번 시행되므로 이와 같이 인원 수를 줄이는 동작을 두 번 시행.

#include<bits/stdc++.h>

using namespace std;

int n,m, l,r, ll, rr;

int main(void){
    cin >> n >> m;
    int g[n][m];
    int cnt = 0;
    
    for (int i=0; i<n; i++){
        for (int j=0; j<m; j++){
            cin >> g[i][j];
            if (g[i][j] == 1){
                cnt++;
            }
        }
    }

    cin >> l >> r;
    cin >> ll >> rr;

    for (int i=l+1; i<l+5; i++){
        while (true){
            for (int j=0; j<m; j++){
                if (g[i][j]==1){
                    g[i][j] = 0;
                    cnt--;
                    break;
                }
            }
        }
    }

    for (int i=ll+1; i<ll+5; i++){
        while (true){
            for (int j=0; j<m; j++){
                if (g[i][j]==1){
                    cnt--;
                    break;
                }
            }
        }
    }
    cout << cnt;
    return 0;
}

 

맞힌 코드

#include<bits/stdc++.h>

using namespace std;

int n,m, l,r, ll, rr;

int main(void){
    cin >> n >> m;
    int arr[n] = {0,};
    int cnt = 0;

    int x;
    
    for (int i=0; i<n; i++){
        for (int j=0; j<m; j++){
            cin >> x;
            if (x == 1){
                arr[i]++;
            }
        }
    }

    cin >> l >> r;
    cin >> ll >> rr;

    for (int i=l-1; i<l+4; i++){
        if (arr[i]>0){
            arr[i]--;
        }
    }

    for (int i=ll-1; i<ll+4; i++){
        if(arr[i]>0){
            arr[i]--;
        }
    }

    for (int i=0; i<n; i++){
        cnt += arr[i];
    }
    cout << cnt;
}