개요
이번 문제는 백준의 거짓말 문제입니다.
https://www.acmicpc.net/problem/1043
리뷰와 피드백
문제 자체를 이해함에 있어서 다들 해매었습니다. 뒤에 나온 파티의 내용이 먼저 나온 파티에 영향을 끼치기 때문에
이러한 부분을 잡아내지 못하는 경우가 있었습니다.
다들 각자만의 방법으로 구현을 하였고 서로의 코드에 다른 부분은 있었지만, 성능 상이나 가독성적인 부분에서도
큰 문제는 없어 문제를 풀어보았다는 부분에 의의를 두었습니다.
개선 전 / 후 코드 전문
#include <iostream>
#include <vector>
using namespace std;
int n, m, known;
int main() {
cin >> n >> m >> known;
vector<vector<int>> partys(m); // 파티 별 참가인원을 저장합니다.
vector<bool> isKnow(n+1, false); // 각 참가인원 진실을 아는 지 체크용 (1번 참가자는 1번 인덱스 ...)
for (int i = 0; i < known; ++i) { // 진실을 아는 자 체크
int tmp; cin >> tmp; // !수정사항 15번 줄 주석 수정
isKnow[tmp] = true;
}
// 파티의 수 만큼 반복하며, 파티별 이중벡터(partys)의 idx를 가진다.
for (int idx = 0; m > 0; --m, ++idx) {
int partySize; cin >> partySize;
for (int j = 0; j < partySize; ++j) { // 각 파티의 길이만큼 입력받는다.
int tmp; cin >> tmp;
partys[idx].push_back(tmp);
}
}
while (1) { // isKnow에 새로운 추가가 없을 때 까지 무한반복해서 진실 아는 자 유무체크
bool isAdd = false; // !수정사항 30번 줄 주석 오류
// 추가 된 것이 없다면 false, 반대는 true
for (auto v : partys) {
bool isThere = false; // 파티 별 진실 아는 자가 있는 지 체크
for (int& p : v) {
if (isKnow[p] == true) isThere = true;
}
for (int& p : v) {
if (!isThere) break; // 진실 아는 자 없다면 스킵
if (isKnow[p] != true) isAdd = true; // 새로 알게 된 사람이 있다면 true
isKnow[p] = true;
}
}
if (!isAdd) break; // 더이상 새로 알게된 사람이 없다면 무한루프 탈출
}
int ans = 0;
for (auto v : partys) { // 모든 파티를 순회하며 각 파티 별 진실을 아는자가 없다면 ans 증가
bool isThere = false;
for (int& p : v) {
if (isKnow[p]) isThere = true;
}
if (!isThere) ++ans;
}
cout << ans;
}
향후 방침, 느낀 점
이전 피드백을 토대로 주석이나 가독성적인 부분에 신경을 썼습니다.
가독성을 위해 적지않은 시간을 투자하는데, 차리리 가독성에 큰 신경을 쓰기 보단 다른 문제를 하나 더 푸는 건 어떤가라는 이야기를 들었습니다. 꽤 경력이 화려하신 분이라 어느 정도 납득은 갔지만 일단 지금은 가독성에도 어느 정도 신경을 쓰면서 배우고 싶네요.
'함께 스터디 > PS스터디 심화반' 카테고리의 다른 글
[PS스터디 심화반] 4주차 백준 감시 (0) | 2022.08.01 |
---|---|
[PS스터디 심화반] 3주차 백준 외판원 순회 (0) | 2022.08.01 |
[PS스터디 심화반] 3주차 백준 소수의 연속합 (0) | 2022.08.01 |
[PS스터디 심화반] 2주차 백준 보석도둑 (0) | 2022.08.01 |
[PS스터디 심화반] 1주차 백준 멀티탭 스케줄링 (0) | 2022.07.08 |
댓글