반응형
https://www.acmicpc.net/problem/2578
구현문제였습니다.
풀이방법
대각선으로 빙고가 되는 경우를 잘 구현해야하는 문제였습니다.
(3,3)일 때는 오른쪽 아래로 향하는 대각선과 오른쪽 위로 향하는 대각선을 둘 다 봐줘야 합니다.
가로 세로 대각선을 체크하는 함수를 각각 구현하여 이들의 합이 3이상이 되었을 때 종료되게 구현했습니다.
Code
#include <iostream>
using namespace std;
int bingo[6][6];
int ck[6][6];
//가로
int hor(int x, int y) {
int cnt = 0;
for (int i = 1; i <= 5; i++)
if (ck[x][i] == 1)
cnt++;
if (cnt == 5)return 1;
else return 0;
}
//세로
int ver(int x, int y) {
int cnt = 0;
for (int i = 1; i <= 5; i++)
if (ck[i][y] == 1)
cnt++;
if (cnt == 5)return 1;
else return 0;
}
//대각선 2곳
int diag(int x, int y) {
int cnt = 0;
int ans = 0;
//아래로 대각선
if (x == y)
{
for (int i = 1; i <= 5; i++)
{
if (ck[i][i] == 1)
cnt++;
}
if (cnt == 5)
ans++;
//(3,3)인 경우에는 대각선이 2개 생기므로 둘 다봐주어야 한다.
if (x == 3 && y == 3)
{
//위로 대각선
cnt = 0;
for (int i = 1; i <= 5 - x; i++)
{
if (ck[x + i][y - i] == 1)
cnt++;
}
for (int i = 0; i <= x - 1; i++)
{
if (ck[x - i][y + i] == 1)
cnt++;
}
if (cnt == 5)
ans++;
}
}
else {
//위로 대각선
cnt = 0;
for (int i = 1; i <= 5 - x; i++)
{
if (ck[x + i][y - i] == 1)
cnt++;
}
for (int i = 0; i <= x - 1; i++)
{
if (ck[x - i][y + i] == 1)
cnt++;
}
if (cnt == 5)
ans++;
}
return ans;
}
int result(int x, int y) {
return hor(x, y) + ver(x, y) + diag(x, y);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int num;
int cnt = 0;
int seq = 0;
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; j++)
cin >> bingo[i][j];
for (int i = 1; i <= 25; i++)
{
cin >> num;
seq++;
//num을 찾기
for (int k = 1; k <= 5; k++)
{
for (int j = 1; j <= 5; j++)
{
//해당 숫자 체크
if (bingo[k][j] == num)
{
ck[k][j] = 1;
cnt += result(k, j);
if (cnt >= 3)
{
cout << seq << '\n';
return 0;
}
}
}
}
}
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 1018번 : 체스판 다시 칠하기 (0) | 2020.01.08 |
---|---|
(C++) - 백준(BOJ) 16727번 : ICPC (0) | 2020.01.08 |
(C++) - 백준(BOJ) 11931번 : 수 정렬하기 4 (0) | 2020.01.06 |
(C++) - 백준(BOJ) 11004번 : K번째 수 (0) | 2020.01.06 |
(C++) - 백준(BOJ) 16199번 : 나이 계산하기 (0) | 2019.12.21 |