Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- EditText
- hilt
- Parcelable
- 조합
- 시뮬레이션
- 약수 구하기
- 스카이라인 쉬운거
- BFS
- 백준
- Android
- BuildConfig
- Kotlin
- Parcelize
- java
- 2501
- 순열
- 자바
- 프로그래머스
- val
- EditorInfo
- 백준 퇴사
- 최단경로
- 백준 14501
- dfs
- 오르막수
- imeOptions
- SWEA
- 완전탐색
- 순수함수
- 지능형 기차2
Archives
- Today
- Total
안드 공부를 해볼까?
[Java] 백준 빙고 본문
728x90
1. 문제분석
빙고가 3개일 때 몇번째 입력에서 됐는지 출력하는 문제다.
빙고판은 5 * 5로 고정이니 쉽게 풀 수 있다.
빙고가 되는 조건은 간단하다. 가로, 세로, 왼쪽 대각선, 오른쪽 대각선이다.
구현에서 자세히보자.
2. 구현
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int count = 0;
static int check = 0;
static int[][] board = new int[5][5];
static boolean[][] checkArr = new boolean[5][5];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
int input = Integer.parseInt(st.nextToken());
//숫자를 가져왔고 2중 for문 탐색
for (int k = 0; k < 5; k++) {
for (int l = 0; l < 5; l++) {
if (board[k][l] == input) {
checkArr[k][l] = true;
//여기서 계산을 해준다.
checkData();
//빙고가 3개이상되면 몇번째인지 출력
if (count >= 3) {
System.out.println((i * 5) + (j + 1));
return;
}
count = 0;
}
}
}
}
}
}
static void checkData() {
//가로, 세로
checkTable();
//대각선(왼쪽, 오른쪽)
checkCross();
}
//가로, 세로 구분
static void checkTable() {
for (int i = 0; i < 5; i++) {
boolean w_check = true;
boolean h_check = true;
for (int j = 0; j < 5; j++) {
if (!checkArr[i][j]) {
w_check = false;
}
if (!checkArr[j][i]) {
h_check = false;
}
}
//boolean 값으로 만약 1개라도 false가 있으면 안됨.
if (w_check) count++;
if (h_check) count++;
}
}
static void checkCross() {
boolean l_cross = true;
boolean r_cross = true;
for (int i = 0; i < 5; i++) {
//왼쪽
if (!checkArr[i][i]) {
l_cross = false;
}
//오른쪽
if (!checkArr[i][4 - i]) {
r_cross = false;
}
}
if (l_cross) count++;
if (r_cross) count++;
}
}
보드의 정보도 필요하니 int형 2차원 배열을 초기화했다.
또한, 방문했는지 안했는지는 boolean형 2차원 배열로 선언했다.
checkCross는 대각선, checkTable은 가로, 세로를 찾는다.
여기서 중요한 점은 count, 즉, 밑의 경우 처럼 빙고가 2개에서 4개가 되는 경우도 있다.
o o o o x
x x x x o
x x x x o
x x x x o
x x x x o
bold된 부분이 들어가면 빙고가 0개에서 2개가 된다.
이런경우를 대비해서 3이상이면 결과를 출력한다.
3. 마무리
이 문제를 풀면서 현타가 왔다.
분명 맞게 구현했는데 계속 틀렸습니다가 나오는 것이다. 처음은 main에서 전부 구현해서 내가 잘못한 줄 알았다.
하지만 나는 빙고가 3개 됐을 때 사회자가 부른값을 출력했고 문제는 인덱스를 출력하라고 한다.
구현은 20분만에 끝냈지만 테스트케이스 찾고 계속 수정하느라 2시간 걸린 문제..
제발 문제좀 제대로 읽자..
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Java] 백준 안전 영역 (0) | 2022.08.21 |
---|---|
[Java] 백준 단지번호붙이기 (0) | 2022.08.21 |
[Java] 백준 수열 (0) | 2022.08.20 |
[Java] 백준 종이자르기 (0) | 2022.08.20 |
[Java] 백준 스위치 켜고 끄기 (0) | 2022.08.20 |
Comments