본문 바로가기
함께 스터디/PS스터디 심화반

[PS스터디 심화반] 1주차 백준 거짓말

by Unagi_zoso 2022. 8. 1.

개요

 

이번 문제는 백준의 거짓말 문제입니다.

 

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;
}

 

 

 

 

 

 

 

향후 방침, 느낀 점

 

 

이전 피드백을 토대로 주석이나 가독성적인 부분에 신경을 썼습니다. 

가독성을 위해 적지않은 시간을 투자하는데, 차리리 가독성에 큰 신경을 쓰기 보단 다른 문제를 하나 더 푸는 건 어떤가라는 이야기를 들었습니다. 꽤 경력이 화려하신 분이라 어느 정도 납득은 갔지만 일단 지금은 가독성에도 어느 정도 신경을 쓰면서 배우고 싶네요.

 

 

댓글