본문 바로가기

백준/실버

[백준 28238번] 정보 선생님의 야망 (C++)

문제링크 : https://www.acmicpc.net/problem/28238

 

28238번: 정보 선생님의 야망

송도고의 정보 선생님, 박상진 선생님은 송도고를 코딩을 좋아하는 친구라면 누구든지 들어오고 싶어 하는 명성이 자자한 학교로 만들고자 하는 야망이 있다. 박상진 선생님은 이를 위해 주 $2$

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int arr[1000001][5];
int cnt, maxV = -1;
int idx[5];

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

    for(int i=0; i<N; i++)
    {
        for(int j=0; j<5; j++)
        {
            cin >> arr[i][j];
        }
    }


    for(int i=0; i<4; i++)
    {
        for(int j=i+1; j<5; j++)
        {
            cnt = 0;
            for(int k=0; k<N; k++)
            {
                if(arr[k][i] && arr[k][j]) cnt++; //2열씩 체크 후 카운팅
            }
            if(maxV < cnt)
            {
                memset(idx, 0, sizeof(idx));
                maxV = cnt; //최댓값 저장
                idx[i]=1; //첫번째 위치 저장
                idx[j]=1; //두번째 위치저장
            }
        }
    }

    cout << maxV << "\n";
    for(int i=0; i<5; i++)
    {
        cout << (idx[i]==1 ? 1 : 0) << " "; //앞에서 저장한 위치면 1출력 이외엔 0출력
    }

    return 0;
}

열을 기준으로 현재 열과 그 다음에 올 수 있는 열의 값을 확인하여 둘다 1인 경우를 카운팅한다.

이렇게 카운팅한 값이 최대일때 해당 첫번째 열의 위치값과 두번째 열의 위치값을 각각 저장해준다.

이후 반복문을 돌려서 해당 위치값에 해당하면 1을 아니면 0을 출력해준다.

 

이 문제에서 주의해야 할 것은 최대값을 저장하는 변수를 처음에 0보다 낮은 값으로 해줘야한다.

왜냐하면 최대값이 0이 될 수도 있기 때문에 최대값을 저장하는 변수가 0이면 최대값이 0일때 열의 위치값을 저장하지 않아서 틀린 답이 되어버린다.

나도 이때문에 계속 틀리다가 해당 문제의 질문게시판을 보고 왜 틀린지 알 수 있게 되었다.