2021년 7월 21일 수요일 - 오늘은 이렇게 더워도 되나 싶다;


오늘 올려볼 문제는 2578번 빙고 라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

백준 문제 사진
백준 문제 사진

오늘은 딱 보기에도 쉬워보이는 문제를 가져왔다!
이번에는 진짜로 쉽다는 거


입력 예제

백준 입력 예제


배열의 크기도 25이고 들어오는 입력의 최대 개수도 25개이므로 그저 선형적으로 문제를 풀어도 아마 잘 풀릴 것이다.


하지만 나는 욕심을 좀 더 내서 더 빠르게 문제를 풀어볼 예정이다!
하지만 입력 케이스가 크지 않아서 큰 차이는 없을 것이다...




풀이 및 코드

그래서 생각해낸 기법은 boolean 배열을 사용하는 방법이다!


백문이 불여일견이라고 바로 코드를 봐보자!


풀이코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 해당 숫자를 사회자가 불렀는지 확인하는 boolean 배열
        boolean[] check = new boolean[26];
        // 빙고판으로 사용되는 int 배열
        int[][] bingo = new int[5][5];
        // 결과값 저장하는 변수
        int result = 0;

        // 빙고판에 숫자 넣기
        for(int i = 0; i < 5; i++)
        {
            String[] input = br.readLine().split(" ");

            for(int j = 0; j < 5; j++)
            {
                bingo[i][j] = Integer.parseInt(input[j]);
            }
        }

        Loop:
        for(int i = 0; i < 5; i++)
        {
            String[] input = br.readLine().split(" ");

            for(int j = 0; j < 5; j++)
            {
                // 선이 그어진 개수를 세는 변수
                int lines = 0;

                // 사회자가 부른 숫자를 true로 바꾸어준다.
                check[Integer.parseInt(input[j])] = true;

                // 결과값 + 1
                result++;

                // 가로줄, 세로줄 확인하는 과정
                for(int a = 0; a < 5; a++)
                {
                    if(check[bingo[a][0]] && check[bingo[a][1]] && check[bingo[a][2]] && check[bingo[a][3]] && check[bingo[a][4]])
                        lines++;
                    if(check[bingo[0][a]] && check[bingo[1][a]] && check[bingo[2][a]] && check[bingo[3][a]] && check[bingo[4][a]])
                        lines++;
                }

                // 대각선 2줄 확인하는 과정
                if(check[bingo[0][0]] && check[bingo[1][1]] && check[bingo[2][2]] && check[bingo[3][3]] && check[bingo[4][4]])
                    lines++;
                if(check[bingo[0][4]] && check[bingo[1][3]] && check[bingo[2][2]] && check[bingo[3][1]] && check[bingo[4][0]])
                    lines++;

                // 선이 그어진 줄 수가 3이 넘어가면 반복문 벗어나기
                if(lines >= 3)
                    break Loop;
            }
        }

        bw.write(result + "\n");
        bw.flush();
    }

}



제출 화면

백준 문제 맞았습니다


boolean 배열을 빙고판과 똑같이 2차원 배열로 만드는 것이 아닌 숫자가 불렸는지 판단하는 용도로만 사용하면 선형적으로 접근하지 않고 문제를 풀 수 있다!


오늘은 굉장히 쉬운 문제였지만 시간적으로 좀 더 우세한 방법으로 풀어봤다!

물론 이 방법도 입력 개수가 커지게 되면 사용하기 힘들지만 적당한 입력 개수에서는 사용해볼만한 기법이다!

+ Recent posts