코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67
문제
https://www.acmicpc.net/problem/2578
[나의 풀이]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main{
// 빙고판 만들기
static int [][] makeBoard(int board [][],BufferedReader br,BufferedWriter bw) throws IOException{
StringTokenizer st;
for(int i=0;i<5;i++){
st = new StringTokenizer(br.readLine());
for (int j=0;j<5;j++){
int el = Integer.parseInt(st.nextToken());
board[i][j] = el;
}
}
return board;
}
// 빙코 체크 목록
static int [] makeCheck(int [] check,BufferedReader br,BufferedWriter bw) throws IOException{
StringTokenizer st;
for(int i=1;i<6;i++){
st = new StringTokenizer(br.readLine());
for (int j=1;j<6;j++){
int el = Integer.parseInt(st.nextToken());
check[5*(i-1)+j-1] = el;
}
}
return check;
}
// 빙고 점수 내기
static int counting(int [][] board,int [] check) throws IOException{
int cnt = 0;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i=0;i<check.length;i++){
cnt ++;
int bingo = 0;
Boolean find = false;
for(int j=0;j<5;j++){
for(int k=0;k<5;k++){
if (board[j][k] == check[i]){
board[j][k] = -1;
find = true;
if(find){
break;
}
}
}
if(find){
break;
}
}
int [] diagonal = new int [5];
int [] vertical = new int [5];
int idx_dia = 0;
for(int j=0;j<5;j++){
int idx_ver = 0;
if(Arrays.stream(board[j]).sum()==-5){
bingo ++;
}
for(int k=0;k<5;k++){
if(j+k==4){
diagonal[idx_dia] = board[j][k];
idx_dia++;
}
vertical[idx_ver] = board[k][j];
idx_ver++;
}
if(Arrays.stream(vertical).sum()==-5){
bingo ++;
}
}
if(Arrays.stream(diagonal).sum()==-5){
bingo++;
}
if (bingo>=3){
break;
}
}
return cnt;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int board [][] = new int [5][5];
int check [] = new int [25];
int cnt = 0;
board = makeBoard(board, br, bw); // 빙고판 만들기
check = makeCheck(check, br, bw); // 빙고 체크 목록
cnt = counting(board, check); // 빙고 점수 내기
bw.write(String.valueOf(cnt));
bw.flush();
}
}
[팀원의 풀이]
# coding = utf-8
import sys
input = sys.stdin.readline
bn = 5
bingo = list(list(map(int,input().split())) for _ in range(bn))
call = list(list(map(int,input().split())) for _ in range(bn))
visited = list(list(False for _ in range(bn)) for _ in range(bn))
def printboard(board) :
for row in board :
print(row)
def erasenum(n, bingo, visited) :
for i in range(bn) :
for j in range(bn) :
if bingo[i][j] == n :
visited[i][j] = True
return
def checkbingo(visited) :
ch = 0
# 가로 check
for row in visited :
if row.count(True) == bn :
ch += 1
# 세로 check
for i in range(bn) :
tmp = 0
for j in range(bn) :
if visited[j][i] == True :
tmp += 1
if tmp == bn :
ch += 1
# 좌상 우하 대각선 check
tmp = 0
for i in range(bn) :
if visited[i][i] == True :
tmp += 1
if tmp == bn :
ch += 1
# 우상 좌하 대각선 check
tmp = 0
for i in range(bn):
if visited[i][-i-1] == True:
tmp += 1
if tmp == bn:
ch += 1
return ch
def sol() :
res = 0
for row in call :
for num in row :
erasenum(num, bingo, visited)
res += 1
if checkbingo(visited) >= 3 :
return res
print(sol())