본문 바로가기
백준/구현

[백준 2578번 / Java] 빙고

by ghan2 2024. 5. 10.

빙고문제! 재밌을 줄 알았는데.. 나는 왜 한번에 생각해 내지 못하는 걸까...

 

이 문제는 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