67. [Java] 특별한 이차원 배열 1,2
특별한 이차원 배열 1
https://school.programmers.co.kr/learn/courses/30/lessons/181836
정답코드
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
정답코드
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;
}
}
이 문제의 핵심은 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 리턴하는 구조로 수정했다.