[백준 코딩테스트 연습문제] 문제 풀이 with 자바(Java)

Re_Go·2024년 7월 8일
0

코딩테스트연습

목록 보기
95/106
post-thumbnail

1. 첫번째 문제 풀이(2024-07-08)

해당 문제는 아주 예전에 몇 번 깔짝대고 손을 대지 않았던 이중 배열 문제입니다. 그 중에서도 유명한 '빙고' 문제인데요. 그때 배열 문제를 왜 포기했나 싶었는데 배열 접근이 어려웠던 것이 가장 큰 원인이었다는걸 이번 문제를 보면서 오랜만에 또 느꼈습니다 😅

아무튼 이러한 배열을 접근하는 방법은 크게 네 가지 방법이 존재하는데요. 다음 그림을 보시면 이해가 빠르게 되실거라 생각합니다!

  1. 가로줄 부터 접근 ([i][j]]

(자료 출처 : 미리캔버스로 제작했습니다.)

  1. 세로줄 부터 접근 ([j][i]]

(아래 사진 세 개는 잘못 그려서 업로드 했습니다 ㅜㅜ 그냥 똑같이 동그라미가 J열로 이동한다고 생각해 주세요!)

(자료 출처 : 미리캔버스로 제작했습니다.)

  1. 왼쪽 대각선부터 접근 ([i][i]]

(자료 출처 : 미리캔버스로 제작했습니다.)

  1. 오른쪽 대각선부터 접근 ([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;
    }
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글