틀린 코드
#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로 선언했어야 하는 것이었다.