허어.. 이것도 어렵다.
먼저 배열 두개를 만들어서 하나는 숫자를 저장하고 하나는 불렀던 숫자인지 체크한다.
다음으로 빙고가 되기까지 숫자 12개가 필요하므로 11개까지 숫자를 미리 부른 다음에 다음부터 값을 하나씩 넣으면서 빙고인제 체크한다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> num(25);
vector <bool> check(25);
//num 배열에 숫자 초기화
for(int i = 0; i < 25; i++){
int input;
scanf("%d", &input);
num[i] = input; check[i] = false;
}
//부른 숫자 11개 체크
for(int i = 0; i < 11; i++){
int input;
scanf("%d", &input);
check[input] = true;
}
//숫자 하나 부르고 빙고인지 체크
for(int k = 12; k <= 25; k++){
//숫자 하나 부름
int input;
scanf("%d", &input);
check[input] = true;
//빙고 개수 센다
int bingo = 0;
for(int i = 0; i < 5; i++){
//가로 빙고 있는지
if(check[num[i+0]] == true && check[num[i+1]] == true && check[num[i+2]] == true
&& check[num[i+3]] == true && check[num[i+4]] == true)
bingo++;
//세로 빙고 있는지
if(check[num[0+i]] == true && check[num[5+i]] == true && check[num[10+i]] == true
&& check[num[15+i]] == true && check[num[20+i]] == true)
bingo++;
}
//대각선 빙고 있는지
if(check[num[0]] == true && check[num[6]] == true && check[num[12]] == true
&& check[num[18]] == true && check[num[24]] == true)
bingo++;
if(check[num[4]] == true && check[num[8]] == true && check[num[12]] == true
&& check[num[16]] == true && check[num[20]] == true)
bingo++;
//만약 빙고가 3개 이상이라면 끝!
if(bingo >= 3){
printf("%d", k);
break;
}
}
return 0;
}
음.. 이렇게 했는데 출력되는게 아무것도 없다. 조금 더 생각해봐야겠다.
void print_num(vector <int> &v){
for(int i = 0; i < v.size(); i++){
printf("%d ", v[i]);
if(i % 5 == 4)
printf("\n");
}
}
void print_check(vector <bool> &v){
for(int i = 1; i < v.size(); i++){
cout << v[i];
if(i % 5 == 0)
cout << endl;
}
}
.. 모르겠어서 그냥 출력하면서 어느 부분이 문제인지 봤다. 그래서 배열 출력하는 함수 만듬
함수 두 개 만든 이유는 두 배열 크기가 달라서 따로 만들었음. check는 26칸으로 만들어서 index와 숫자가 똑같게 만들어줬다.
//num 배열에 숫자 초기화
for(int i = 0; i < 25; i++){
int input;
scanf("%d", &input);
num[i] = input; check[i] = false;
}
check[25] = false;
print_num(num);
printf("\n");
//부른 숫자 11개 체크
for(int i = 0; i < 11; i++){
int input;
scanf("%d", &input);
check[input] = true;
}
print_check(check);
printf("\n");
이까지 했을 때 출력결과이다. 잘 들어갔다! 결과는 15지만 13이 나와서 어디가 틀렸는지 계속 살펴봐야 할 것 같다.
k가 12일때 18이 들어왔다. check 배열의 18번째 칸을 true로 만들어줬다. 여기는 문제 안 생기는 것 같고.. 보니 13번째에 숫자 세는 게 문제인 것 같다.
13번째 값이 들어왔을 때 가로세로는 1개 대각선은 1개가 돼야 하는데 가로세로 부분에서 2개가 됐다. 그래서 이 부분을 살펴보니 조건을 잘못 세웠다.
//가로 빙고 있는지
if(check[num[i+0]] == true && check[num[i+1]] == true && check[num[i+2]] == true
&& check[num[i+3]] == true && check[num[i+4]] == true)
이거 처음에는 0, 1, 2, 3, 4를 비교하는데 i가 1이 되면 1, 2, 3, 4, 5를 비교한다ㅋㅋㅋ 그래서 이 부분을 아래와 같이 고쳤다.
if(check[num[5*i+0]] == true && check[num[5*i+1]] == true && check[num[5*i+2]] == true
&& check[num[5*i+3]] == true && check[num[5*i+4]] == true)
이제 잘 돌아간다!
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> num(25);
vector <bool> check(26);
//num 배열에 숫자 초기화
for(int i = 0; i < 25; i++){
int input;
scanf("%d", &input);
num[i] = input; check[i] = false;
}
check[25] = false;
//부른 숫자 11개 체크
for(int i = 0; i < 11; i++){
int input;
scanf("%d", &input);
check[input] = true;
}
//숫자 하나 부르고 빙고인지 체크
for(int k = 12; k <= 25; k++){
//숫자 하나 부름
int input;
scanf("%d", &input);
check[input] = true;
//빙고 개수 센다
int bingo = 0;
for(int i = 0; i < 5; i++){
//가로 빙고 있는지
if(check[num[5*i+0]] == true && check[num[5*i+1]] == true && check[num[5*i+2]] == true
&& check[num[5*i+3]] == true && check[num[5*i+4]] == true)
bingo++;
//세로 빙고 있는지
if(check[num[0+i]] == true && check[num[5+i]] == true && check[num[10+i]] == true
&& check[num[15+i]] == true && check[num[20+i]] == true)
bingo++;
}
//대각선 빙고 있는지
if(check[num[0]] == true && check[num[6]] == true && check[num[12]] == true
&& check[num[18]] == true && check[num[24]] == true)
bingo++;
if(check[num[4]] == true && check[num[8]] == true && check[num[12]] == true
&& check[num[16]] == true && check[num[20]] == true)
bingo++;
//만약 빙고가 3개 이상이라면 끝!
if(bingo >= 3){
printf("%d", k);
break;
}
}
return 0;
}
맞았다!! 야호!
'백준' 카테고리의 다른 글
10163 색종이 (0) | 2019.10.27 |
---|---|
1408 24 (0) | 2019.10.27 |
1834 나머지와 몫이 같은 수 (0) | 2019.10.25 |
2851 슈퍼마리오 (0) | 2019.10.25 |
2460 지능형기자 2 (0) | 2019.10.25 |