해당 문제는 아주 예전에 몇 번 깔짝대고 손을 대지 않았던 이중 배열 문제입니다. 그 중에서도 유명한 '빙고' 문제인데요. 그때 배열 문제를 왜 포기했나 싶었는데 배열 접근이 어려웠던 것이 가장 큰 원인이었다는걸 이번 문제를 보면서 오랜만에 또 느꼈습니다 😅
아무튼 이러한 배열을 접근하는 방법은 크게 네 가지 방법이 존재하는데요. 다음 그림을 보시면 이해가 빠르게 되실거라 생각합니다!
- 가로줄 부터 접근 ([i][j]]
(자료 출처 : 미리캔버스로 제작했습니다.)
- 세로줄 부터 접근 ([j][i]]
(아래 사진 세 개는 잘못 그려서 업로드 했습니다 ㅜㅜ 그냥 똑같이 동그라미가 J열로 이동한다고 생각해 주세요!)
(자료 출처 : 미리캔버스로 제작했습니다.)
- 왼쪽 대각선부터 접근 ([i][i]]
(자료 출처 : 미리캔버스로 제작했습니다.)
- 오른쪽 대각선부터 접근 ([i][대각선의 길이 - 1 - i]]
(자료 출처 : 미리캔버스로 제작했습니다.)
뭐... 아무튼 알고리즘은 이렇습니다 ㅎㅎ (제가 이해하고 싶어서 두고두고 써먹으려고 그림판으로 제작했습니다.) 그리고 해당 문제는 JS로 풀려고 했는데, 파일 입력 하는 부분에서 1시간째 막혀서 🤣 그래서 배열 문제를 풀때는 자바로만 국한해서 좀 풀려고 합니다...
아무튼 자바 버전으로 푼 해당 문제의 코드는 아래와 같습니다.
import java.util.*; import java.io.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int[][] bingo = new int[5][5]; int count = 0; // 사용자에게 받을 값 입력 for (int i = 0; i < bingo.length; i++) { for (int j = 0; j < bingo[i].length; j++) { bingo[i][j] = sc.nextInt(); } } for (int q = 1; q <= 25; q++) { int num = sc.nextInt(); for (int i = 0; i < bingo.length; i++) { for (int j = 0; j < bingo[i].length; j++) { if (bingo[i][j] == num) // 사회자가 부른 숫자와 같다면 0으로 바꾸기 bingo[i][j] = 0; } } count = checker(bingo); if (count >= 3) { // 3줄 이상 빙고이면 몇 번째 숫자인지 출력하고 종료 System.out.println(q); break; } count = 0; } } // 빙고 줄 체크 메서드 public static int checker(int[][] bingo) { int result = 0; // 가로 줄 체크 for (int i = 0; i < bingo.length; i++) { int count = 0; for (int j = 0; j < bingo[i].length; j++) { if (bingo[i][j] == 0) count++; } if (count == 5) result++; } // 세로 줄 체크 for (int i = 0; i < bingo.length; i++) { int count = 0; for (int j = 0; j < bingo[i].length; j++) { if (bingo[j][i] == 0) count++; } if (count == 5) result++; } // 왼쪽 대각선 체크 int count = 0; for (int i = 0; i < bingo.length; i++) { if (bingo[i][i] == 0) count++; } if (count == 5) result++; // 오른쪽 대각선 체크 count = 0; for (int i = 0; i < bingo.length; i++) { if (bingo[i][bingo.length - 1 - i] == 0) count++; } if (count == 5) result++; return result; } }