개발세발은 안되요

[C++] BJO 1101 : 카드 정리1 본문

알고리즘/백준

[C++] BJO 1101 : 카드 정리1

금호박 2026. 1. 13. 14:41

문제

https://www.acmicpc.net/problem/1101

 

 

 

 

 

 

 

풀이

1. n개의 상자 중 조커 상자를 하나 선택한다. (반복문 이용하여 조커 상자를 n번 선택)

 

2. 조커 상자를 제외하고 나머지 상자를 조사한다.

    a. 만약 해당 상자에 카드의 종류가 하나뿐이면서, 동시에 해당 카드의 종류가 선점되지 않았다면 카드의 이동은 필요없다.

    b. 만약 해당 상자에 카드가 여러 종류이거나 또는 이미 다른 상자에서 선점된 카드만 들어 있다면 카드의 이동이 필요하다.

 

3. 최소 count 값을 출력한다.

 

 

 

 

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int n,m, ans = 100000000;
int box[51][51]; // 처음 상자 정보 : i번 상자에 j번 색 카드가 몇 장 들어있다

int main() {
    cin >> n >> m;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> box[i][j];
        }
    }

    // 조커 상자 정하기 
    for(int cur = 0; cur<n; cur++){
        int cal = 0;
        int visited[m] = {0};
        for(int i = 0; i<n; i++){
            
            if(i == cur) continue;

            // 현재 상자의 종류 구분하기 
            int color = -1;
            int t = 1; // 0 이면 옮겨야 함. 1이면 안 옮겨도 됨. 
            for(int j=0; j<m; j++){
                if(box[i][j] != 0 && color == -1){
                    color = j;
                } 
                else if(box[i][j] != 0 && color != -1){
                    t = 0;
                    break;
                }
            }

            if(color == -1) continue;

            if(t == 0 || visited[color] != 0){
                cal++;
            }

            else if(t == 1 && visited[color] == 0){
                visited[color] = 1;
            }
        }

        ans = min(ans, cal);
    }
    

    
    cout << ans << "\n";
    
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[C++]BJO : 1117 : 색칠 1  (0) 2026.01.15
[C++] BJO 1058 : 친구  (0) 2026.01.14
[C++] BJO 1024 : 수열의 합  (0) 2026.01.09
[C++] BJO 17142 : 연구소 3  (0) 2025.12.01
[C++]BJO 14891 : 톱니바퀴  (0) 2025.11.28