danbibibi
article thumbnail

문제

문제 바로가기> SWEA 2112번: 보호 필름

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이

"성능검사를 통과하기 위한 최소 약품투입 횟수"를 구하기 위해 부분 집합을 이용해 문제를 풀었다!

 

#include <iostream>
#define MAX_Y 14
#define MAX_X 21
using namespace std;

int Y, X, K;
int ans = 0;
bool film[MAX_Y][MAX_X];

void input()
{
    cin >> Y >> X >> K;
    for (int i = 0; i < Y; i++)
    {
        for (int j = 0; j < X; j++)
            cin >> film[i][j];
    }
    ans = K; // init
}

bool check()
{ // 단면의 모든 세로방향에 대해서
  // 동일한 특성의 셀들이 K개 이상 연속적으로 있는 경우에만 성능검사를 통과
    for (int x = 0; x < X; x++)
    {
        int tmp = 1;
        bool before = film[0][x];
        for (int y = 1; y < Y; y++)
        {
            if (film[y][x] == before)
            {
                if (++tmp >= K)
                    break;
            }
            else
            {
                before = film[y][x];
                tmp = 1;
            }
        }
        if (tmp < K) // 성능 검사를 통과할 수 없는 경우
            return false;
    }
    return true;
}

void solution(int cnt, int use)
{
    if (cnt == Y || ans <= use)
    { // 모두 시도해본 경우, 이미 더 작은 해답을 찾은 경우

        if (check()) // 성능 검사를 통과한 경우
            ans = min(ans, use);
        return;
    }
    // as it is
    solution(cnt + 1, use);

    // save state
    int tmp[MAX_X];
    for (int x = 0; x < X; x++)
        tmp[x] = film[cnt][x];

    // change all A
    for (int x = 0; x < X; x++)
        film[cnt][x] = false; // A
    solution(cnt + 1, use + 1);

    // change all B
    for (int x = 0; x < X; x++)
        film[cnt][x] = true; // B
    solution(cnt + 1, use + 1);

    // recovery state
    for (int x = 0; x < X; x++)
        film[cnt][x] = tmp[x];
}

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

    int T;
    cin >> T;
    for (int t = 1; t <= T; t++)
    {
        input();
        solution(0, 0);
        cout << "#" << t << " " << ans << "\n";
    }
}

'문제 풀이 > SWEA' 카테고리의 다른 글

SWEA 5650번: 핀볼 게임  (0) 2023.05.13
SWEA 2382번: 미생물 격리  (0) 2023.04.03
SWEA 4193번: 수영대회 결승전  (0) 2023.04.01
SWEA 5653번: 줄기세포 배양  (0) 2023.03.05
SWEA 2115번: 벌꿀채취  (0) 2023.03.04
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로