빙고문제! 재밌을 줄 알았는데.. 나는 왜 한번에 생각해 내지 못하는 걸까...
이 문제는 Node 라는 위치값을 가진 클래스를 만들어 해결했다.
빙고를 불러줄 때 그 위치값을 찾아서 방문표시를 하고, 빙고 여부를 확인하는 방식으로 구현했다.
위치값을 반복문을 써서 찾을 수 있겠지만 너무 비효율적이라는 생각이 들어서 map을 사용했다.
map<값, Node<x, y>> 형식으로 저장했다.
불러준 위치에 방문하는 것은 문제가 없었는데 빙고 개수를 확인하는 데 시간을 많이 썼다,,
대각선의 빙고를 확인할 때 x, y값이 서로 같은 경우만 생각했던 것이 문제였다ㅠㅠ
(1, 1) (2, 2) (3, 3) (4, 4) (5, 5) 인 경우도 있지만
(5, 1) (4, 2) (3, 3) (2, 4) (1, 5) 인 경우도 있다!!
이 경우까지 고려하여 수정한 결과 원하는 답이 나왔다 -!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
public static class Node {
int x;
int y;
public Node(int i, int j) {
x = i;
y = j;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Map<Integer, Node> map = new HashMap<>();
boolean[][] visited = new boolean[6][6];
int bingoCount = 0;
StringTokenizer st = null;
for(int i = 1; i <= 5; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= 5; j++) {
map.put(Integer.parseInt(st.nextToken()), new Node(i, j));
}
}
for(int i = 1; i <= 5; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= 5; j++) {
Node position = map.get(Integer.parseInt(st.nextToken()));
visited[position.x][position.y] = true;
bingoCount += checkBingo(visited, position);
if(bingoCount >= 3) {
System.out.println((i-1) * 5 + j);
return;
}
};
}
}
private static int checkBingo(boolean[][] visited, Node position) {
int bingo = 0;
if(position.x == position.y) {
//대각선도 검사
for(int i = 1; i <= 5; i++) {
if(!visited[i][i]) {
break;
}
if(i == 5) {
bingo++;
}
}
}
if((position.x ==5 && position.y == 1) || (position.x == 4 && position.y == 2) ||
(position.x == 3 && position.y == 3) || (position.x == 2 && position.y == 4) || (position.x == 1 && position.y == 5)) {
for(int i = 1; i <= 5; i++) {
if(!visited[i][6 - i]) {
break;
}
if(i == 5) {
bingo++;
}
}
}
for(int i = 1; i <= 5; i++) {
if(!visited[i][position.y]) {
break;
}
if(i == 5) {
bingo++;
}
}
for(int i = 1; i <= 5; i++) {
if(!visited[position.x][i]) {
break;
}
if(i == 5) {
bingo++;
}
}
return bingo;
}
}
'백준 > 구현' 카테고리의 다른 글
[백준 5597번 / Java] 과제 안 내신 분..? (0) | 2024.05.10 |
---|