본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 5600 품질검사

by 까망 하르방 2021. 2. 20.
반응형

출처: https://www.acmicpc.net/problem/5600

 Input 

2 2 2

4

2 4 5 0

2 3 6 0

1 4 5 0

2 3 5 1

 

 Output 

2

1

1

0

1

0

부품의 상태를 확신할 수 있는 경우는 언제일까?

① 검사 결과가 정상인 경우 → 3가지 부품이 모두 정상.

② 정상 + 정상 + x = 불합격 → x 부품 = 고장 상태

그 외의 경우에는 알 수가 없습니다.

ex) 정상 + 고장 + x = 불합격 → x의 상태는 알 수 없습니다.

ex) 고장 + 고장 + x = 불합격 → x의 상태는 알 수 없습니다.

ex) 정상 + 정상 + x = 불합격 → x의 상태는 알 수 없습니다.

 

부품들의 상태를 알 수 없는 상태(= 2)로 초기화 합니다.

그 후, 검사 결과 = 합격인 부품들을 모두 정상 상태(= 1)로 처리합니다.

마지막으로 {정상 + 정상 + x = 불합격}인 경우를 찾아 x 부품을 고장 상태(= 0)로 처리합니다.

그 외의 처리되지 않은 부품은 알 수 없는 상태를 유지합니다.

 


#include <iostream>
using namespace std;
#define BROKEN 0
#define NORMAL 1
#define UNKNOWN 2
 
typedef struct {
    int first, second, third;
    bool result;
} checker;
 
int a, b, c, N, temp;
int parts[301];
checker checkers[1001];
 
void findBrokenPart(int idx) {
    int normalCnt = 0;
    if (parts[checkers[idx].first] == NORMAL) normalCnt++;
    if (parts[checkers[idx].second] == NORMAL) normalCnt++;
    if (parts[checkers[idx].third] == NORMAL) normalCnt++;
 
    if (normalCnt == 2) {
        if (parts[checkers[idx].first] == UNKNOWN) parts[checkers[idx].first] = BROKEN;
        if (parts[checkers[idx].second] == UNKNOWN) parts[checkers[idx].second] = BROKEN;
        if (parts[checkers[idx].third] == UNKNOWN) parts[checkers[idx].third] = BROKEN;
    }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    cin >> a >> b >> c >> N;
 
    // 모드 부품을 알 수 없는 상태로 설정
    for (int i = 1; i <= a + b + c; ++i)
        parts[i] = UNKNOWN;
 
    // 검사 결과
    for (int i = 1; i <= N; i++) {
        cin >> checkers[i].first >> checkers[i].second >> checkers[i].third >> temp;
        checkers[i].result = temp == 1 ? true : false;
    }
 
    // 정상으로 판단된 검사를 토대로 해당 부품들을 정상으로 처리
    for (int i = 1; i <= N; i++) {
        if (checkers[i].result) {
            parts[checkers[i].first] = NORMAL;
            parts[checkers[i].second] = NORMAL;
            parts[checkers[i].third] = NORMAL;
        }
    }
 
    // 2개의 정상 부품 사이에서 고장난 부품 한 개 찾기
    for (int i = 1; i <= N; i++) {
        if (!checkers[i].result) {
            findBrokenPart(i);
        }
    }
 
    // 정답 출력
    for (int i = 1; i <= a + b + c; ++i)
        cout << parts[i] << endl;
}

 

반응형

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

[BOJ] 백준 1461 도서관  (4) 2021.02.20
[BOJ] 백준 1043 거짓말  (0) 2021.02.20
[BOJ] 백준 1987 알파벳  (0) 2021.02.20
[BOJ] 백준 3987 보이저 1호  (0) 2021.02.20
[BOJ] 백준 1339 단어 수학  (0) 2021.02.20

댓글