fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 5600 (C++) 품질검사
최초 업로드: 2025-10-30 04:27:12
최근 수정 시간: 2025-10-30 04:29:42
게시자: rlatjwls3333
카테고리: 백준
조회수: 13
# [Silver II] 품질검사 [문제 링크](https://www.acmicpc.net/problem/5600) ## 문제 설명 <p>공장이는 기계 부품을 만드는 공장에서 품질 관리 책임자를 맡고 있다. 이 공장에서는 A, B, C 부품을 생산하는데, 매일 각 부품을 a, b, c개씩 생산한다. 그리고 부품 각각에는 1~a, a+1~a+b, a+b+1~a+b+c의 번호가 붙어있다. 그러나 모든 부품이 완벽하게 만들어지는 것은 아니라서 일부 부품은 결함이 있을 수도 있다. 이에 공장에서는 매일 부품 검사를 시행하는데 그 과정은 다음과 같다.</p> <ul> <li>A, B, C 부품을 각각 하나씩 가져와 연결하고 작동시킨다.</li> <li>모든 부품이 정상인 경우 기계가 정상 작동하여 "합격"</li> <li>부품이 하나라도 고장 난 경우 기계가 오작동하여 "불합격"</li> </ul> <p>이 과정은 매우 정밀하므로 고장 난 부품이 섞여 있는데 우연히 제대로 작동하는 경우는 없다. 그러나 게으른 공장이는 검사 횟수가 충분하지 않더라도 검사를 끝내기도 한다. 공장이가 잘리지 않도록 검사 결과 목록이 주어졌을 때 모든 부품을 다음 세 가지 경우 중 어떤 것인지 분류해주도록 하자.</p> <ul> <li>정상</li> <li>고장</li> <li>알 수 없음</li> </ul> ## 입력 <p>1번째 줄에 전원의 개수 a, 모터의 개수 b, 케이블의 개수 c가 공백으로 구분되어 주어진다. (1 ≦ a, b, c ≦ 100)</p> <p>2번째 줄에 검사 횟수 N이 주어진다. (1 ≦ N ≦ 1000)</p> <p>이어서 N개의 줄에 검사 결과가 주어진다. 전원 번호 i, 모터 번호 j, 케이블 번호 k, 검사 결과 r이 공백으로 구분되어 주어지며, r=1인 경우 합격, r=0인 경우 불합격이다.</p> ## 출력 <p>a+b+c개의 줄에 걸쳐 부품이 어느 분류인지 출력한다.</p> <ul> <li>부품 i가 고장인 경우 0</li> <li>부품 i가 정상인 경우 1</li> <li>부품 i가 고장인지 정상인지 알 수 없는 경우 2</li> </ul> ## 풀이 검사 결과가 합격인 것부터 전부 1로 매핑해놓고, 불합격인 경우, 2개가 1인 경우 나머지 1개가 0이 된다. ``` c++ #include<bits/stdc++.h> using namespace std; int res[301]; struct element { int i, j, k; }; int main() { ios::sync_with_stdio(0); cin.tie(0); int a, b, c, n; cin >> a >> b >> c >> n; vector<element> v; fill(res, res+a+b+c+1, 2); while(n--) { int i, j, k, r; cin >> i >> j >> k >> r; if(r) res[i]=res[j]=res[k]=1; else v.push_back({i, j, k}); } for(auto e:v) { if(res[e.i]==1 && res[e.j]==1) res[e.k]=0; else if(res[e.i]==1 && res[e.k]==1) res[e.j]=0; else if(res[e.j]==1 && res[e.k]==1) res[e.i]=0; } for(int i=1;i<=a+b+c;i++) cout << res[i] << '\n'; } ```