본문 바로가기

Language & Framework/Java

자바 2차원 배열 : 빙고, 행렬 곱셈, 단어 퀴즈

 

1. 빙고

 

아무리 그냥 문제라지만 게임판이 보이게 만들면 빙고가 아니지 않나..?ㅎ

public class NumberBingo {
    final private static int SIZE = 5;
    public static void main (String[] args) {
        int[][] bingoBoard = new int[SIZE][SIZE];

        // 배열 생성
        for ( int i=0; i<SIZE; i++) {
            bingoBoard[i][0] = i;
            for (int j=0; j<SIZE; j++) {
                bingoBoard[i][j] = (j+1) +(SIZE*i);
            }
        }

        // 배열 뒤섞기
        for ( int i=0; i<SIZE; i++) {
            for ( int j=0; j<SIZE; j++) {
                int RandomIndex = (int)(Math.random()*5);
                int temp = 0;
                temp = bingoBoard[i][j];
                bingoBoard[i][j] = bingoBoard[RandomIndex][RandomIndex];
                bingoBoard[RandomIndex][RandomIndex] = temp;
            }
        }

        // 게임 시작
        int chance = 15;
        while (chance > 0) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("번호를 입력해주세요. 남은 기회는"+ chance +"번, 종료는 00번입니다.");
            int answer = scanner.nextInt();

            Loop : for ( int i=0; i<SIZE; i++) {
                for (int j = 0; j < SIZE; j++) {
                    if (answer == bingoBoard[i][j]) {
                        bingoBoard[i][j] = 0;
                        break Loop; // 찾으면 바로 반복문 탈출
                    }
                }
            }

            for (int i=0; i<SIZE; i++) {
                for (int j=0; j<SIZE; j++) {
                    System.out.printf("%5d",bingoBoard[i][j]);
                }
                System.out.println();
            }

            chance -= 1;
        }
    }
}

코드만 쓸데없이 길게 작성했을 뿐 간단한 문제라서 더 얘기할 것이 없다.

만약 빙고판 뒤섞는 게 이해가 안된다면 (https://7357.tistory.com/64)

문제에서 제시된 내용은 아니지만 빙고 개수를 체크해서 점수를 출력하고 싶었는데 생각보다 어려워서 좌절했다.

지금은 최대한 빨리 배우는 게 중요해서 일단 넘어가지만 다음에 꼭.. ^^~~

 

 

 

2. 행렬 곱셈

 

우선 행렬 곱셈은 이렇게 생긴 친구다.

나처럼 의무 교육 과정을 이수한지 오래된 사람들은 뭔지 기억이 가물가물 할 수 있다.

보기만해도 거부감이 든다.

그림으로 표현하자면 아래와 같다.

만약 이렇게 생긴 두 개의 행렬을 곱한다면

첫번째 박스의 1행과 두번째 박스의 1열을 곱하고, 2열을 곱해서 각각 더한 뒤

첫번째 박스의 2행과 두번째 박스의 1열, 2열을 곱하고 각각 더한 뒤 다 더해주면 된다.

이렇게 생각하면 쉬운데 아래 코드를 보면 다시 어렵다.

 

 

public class Matrix {
    public static void main(String[] args) {
        int[][] matrix1 = {
                { 1, 2, 3},
                { 4, 5, 6},
        };

        int [][] matrix2 = {
                { 1, 2 },
                { 3, 4 },
                { 5, 6 },
        };

        int [][] matrix3 = new int[matrix1.length][matrix2[0].length];
                for (int i=0; i<matrix1.length; i++) {
            for (int j=0; j<matrix2[0].length; j++) {
                for (int k=0; k< matrix1[0].length; k++) {
                    matrix3[i][j] += matrix1[i][k] * matrix2[k][j];
                }
            }
        }

        System.out.println(Arrays.deepToString(matrix3));
    }
}

 

똑똑하면 바로 이해가 될 수도 있지만 나는 이 문제가 어려웠다.

 

m3[0][0] =
        m1[0][0]*m2[0][0]
        + m1[0][1]*m2[1][0]
        + m1[0][2]*m2[2][0]

m3[0][1] =
        m1[0][0]*m2[0][1]
        + m1[0][1]*m2[1][1]
        + m1[0][2]*m2[2][1]

m3[1][0] =
        m1[1][0]*m2[0][0]
        + m1[1][1]*m2[1][0]
        + m1[1][2]*m2[2][0]

m3[1][1] =
        m1[1][0]*m2[0][1]
        + m1[1][1]*m2[1][1]
        + m1[1][2]*m2[2][1]

 

일단 이렇게 정리해놓고 봐야 한다.

그런데 이렇게 놓고 보니 누가봐도 2중 for문으로 각각 i, j 대입해주면 되는 아이들이 보인다.

 

 

    m[i][j] = m[i][0] * m2[0][j]
             +m[i][1] * m2[1][j]
             +m[i][2] * m2[2][j]

 

이렇게 말이다.

근데 그럼 0 1 2는 어떻게 해결하지?

아주 간단하게도 안에 반복문 하나 더 만들면 된다.

 

양심적으로 말하자면 나는 여기서 진행이 막혀서 구글을 참고했다.

분발하자.

 

 

 

 

3. 단어 퀴즈 만들기

 

public class VocabularyTest {
    public static void main(String[] args) {
        String[][] words = {
                {"apple", "사과"},
                {"banana", "바나나"},
                {"strawberry", "딸기"}
        };

        for(int i=0; i< words.length; i++) {
            Scanner scanner = new Scanner(System.in);
            System.out.printf("Q%d. %s의 뜻은 무엇인가요?%n", i+1, words[i][0]);
            String input = scanner.nextLine();
            if ( input.equals(words[i][1]) ) {
                System.out.println("훌륭합니다!");
            } else { System.out.println("더 공부하고 돌아오세요.");
            break;}

            if ( i == words.length-1 ) {
                System.out.println("시험 통과!");
            }
        }
    }
}

아주 간단한 문제라서 설명은 생략합니다.