백준 5579 과제 안 내신 분...? C++ 풀이

최윤서·2024년 7월 29일

틀린 코드

#include <bits/stdc++.h>
using namespace std;

int arr [30] ={ 0 };

int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int num = 0;
    
	for (int i=0; i<28 ;i++){
       cin >> num;
       arr[num] = 1;
   }//낸 사람 체크박스 28개 체크
   
   for (int i=0; i<30; i++){
       if(arr[i]==0){
           cout << i << '\n';
       }

   }
  
}

맞은 코드

#include <bits/stdc++.h>
using namespace std;

int arr [30] ={ 0 };

int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int num = 0;
    int a = 0;
    
   for (int i=0; i<28 ;i++){
       cin >> num;
       arr[num] = 1;
   }//낸 사람 체크박스 28개 체크
   
   for (int i=0; i<30; i++){
       if(arr[i]==0){
           cout << i << '\n';
       }

   }
  
}

틀렸던 이유

왜 배열을 31로 해야 할까 생각이 많았는데 처음에 과제 낸 사람 체크할 때는 총 28개의 입력을 받기만 하면 되는 거라서 i가 0~28이어도 상관 없었다.
어차피 입력받은 num에 해당하는 arr[num] 부분의 값만 바꿔주면 특정 인덱스로 바로 찾아가는거라서...

그런데 이제 출력이랑 연관된 두 번째 for문에서는 i를 인덱스삼아서 처음부터 끝까지 체크박스를 훑다가(배열을 훑다가) 안 낸 사람을 바로 출력하는 것이라서 i가 1부터 시작해서 30까지 가야

이걸 헷갈려서 두 for문 다 0부터 시작하고, 바로 출력으로 입력하니까 두 번째 for문에서 계속 주소를 -1된 곳으로 찾아가고 그걸 출력해서 틀렸었다.

arr[2]에 0이 입력된 걸 보고 2를 출력해야 하는데, 없는 0번부터 시작해서 30번은 보지도 못하고... 전체 초기화를 0으로 했으니 입력이 없었던 0은 당연히 0을 제일 먼저 출력하니까 바로 틀림.

인덱스를 바로 출력해야되는거라서 인덱스가 30까지 있을 수 있게 배열 크기도 31로 선언했어야 하는 것이었다.

profile
일 잘 하고싶은 기개디자이너

0개의 댓글