Skip to main content

67. [Java] 특별한 이차원 배열 1,2


특별한 이차원 배열 1

https://school.programmers.co.kr/learn/courses/30/lessons/181836

image.png

정답코드

class Solution {
    public int[][] solution(int n) {
        // [0][0], [1][1], [2][2] 패턴만 0
        int[][] answer = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j) {
                    answer[i][j] = 1;
                }
            }
        } 
        return answer;
    }
}

정방행렬에서 대각선만 1로 채우는 전형적인 "단위행렬(Identity Matrix)" 만들기 문제이다.

핵심은 n x n 2차원 배열을 만들되, 행과 열의 인덱스가 같은 자리에만 1을 넣고, 나머지는 0으로 두는 것이다.

입출력 예를 보고 1이 들어간 자리의 좌표만 적어보면 다음과 같다:

(0,0)
(1,1)
(2,2)
...
(n-1,n-1)

즉, 행 번호와 열 번호가 같을 때만 1이 들어간다는 걸 알 수 있다. 배열은 기본적으로 0으로 초기화되므로 우리는 1만 넣어주면 된다! 그래서 이중 for문으로 배열을 순회하면서, i == j 일때만 1 을 넣는 것이 핵심이다.


특별한 이차원 배열 2

https://school.programmers.co.kr/learn/courses/30/lessons/181831

image.png

정답코드

class Solution {
    public int solution(int[][] arr) {
        int n = arr.length;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (arr[i][j] != arr[j][i]) {
                    return 0; // 하나라도 다르면 대칭 아님
                }
            }
        }

        return 1; // 모든 값이 대칭이면
    }
}

대칭 행렬이란 건 arr[i][j] == arr[j][i]이 조건이 모든 원소 쌍에 대해 참인 경우를 말한다.

입출력 예1은 대칭이다.

int[][] arr = {
    {1, 2, 3},
    {2, 1, 4},
    {3, 4, 1}
};

위에서 아래로 보나, 좌우로 보나 arr[i][j] == arr[j][i] 가 다 맞으니까 대칭 행렬이다.
그리고 나머지는 대각선 또는 자기 자신 (i==j) 이라 당연히 같다.

이중 for문으로 이차원 배열 전체를 돌면서 arr[i][j] 값이 하나라도 arr[j][i]와 일치하지 않으면 대칭이 아니기 때문에 즉시 0을 반환한다.
그리고 for문을 끝까지 순회 한 후 for문 밖에서 모두 일치한 경우 1을 return한다.


오답

class Solution {
    public int solution(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j <arr.length; j++) {
                if (arr[i][j] == arr[j][i]) {
                    return 1;
                }
            }
        }
        
        return 0;
    }
}

image.png

이 문제의 핵심은 2차원 배열이 대칭이어야 한다는 것이다.

  • 대칭 배열은 모든 원소쌍arr[i][j] == arr[j][i]일 때만 대칭이다.
  • 내가 짠 코드는 한 요소만 i,j 값이 같은지 첫 비교 하나만 통과하면 무조건 1을 리턴해버린다.
  • i=0, j=0일 때만 비교한 뒤 조건이 맞으면 1, 아니면 0 리턴하고
  • 나머지 비교를 절대 안 하기 때문에 잘못된 코드이다.

그래서 아래와 같이 수정했다.

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        if (arr[i][j] != arr[j][i]) {
            return 0; // 하나라도 안 맞으면 바로 실패
        }
    }
}
return 1; // 모든 게 맞으면 성공
  • 하나라도 다른 값이 발견되면 즉시 0 리턴하고, 끝까지 문제 없으면 마지막에 1 리턴하는 구조로 수정했다.