
문제 설명
n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.
- 0 ≤ i, j < n인 정수 i, j에 대하여
arr[i][j] = arr[j][i]입출력 예
arr result [[5, 192, 33], [192, 72, 95], [33, 95, 999]] 1 [[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]] 0
이렇게 표로 보면 쉬운데, 친절하게도 문제에서 예시를 설명해준다.

예를 들어 0번 배열의 1번째 숫자는 192다.
그리고 우연히도 1번 배열의 0번째 숫자 역ㅇ시 192다.
이런 식으로 arr[0][1] == arr[1][0] 이 모두 성립하면 1을 리턴하고, 조금이라도 숫자가 다르면 0을 리턴해야 하는 것.
function solution(arr) {
let result = [];
for(let i = 0; i < arr.length; i++){
for(let ele = 0; ele < arr.length; ele++){
//파라미터로 들어온 arr[i]의 [ele]번째 요소와 arr[ele]의 [i]번째 요소를 비교
if(arr[i][ele] == arr[ele][i]){
//숫자가 같으면 result 배열에 true를 집어넣었다.
result.push(true);
}else{
result.push(false);
}
}
}
//result 배열에 false가 하나라도 있으면 0을 리턴한다.(+연산자로 true와 false를 정수로 변환)
return +!result.includes(false);
}
중복된 for문을 2번 돌렸다.
나는 보통 배열을 돌리는 문제를 볼때 무지성으로 map 메소드를 사용하는 버릇이 있으나..보통 여러 인덱스끼리 비교하는 문제를 볼 때는 차라리 for문을 2번 돌리는 것이 헷갈리지 않고 계산도 더 빠르게 되는 느낌이었다. 반복문이 두번이나 돌아가서 계산이 좀 느려지지 않을까 싶었는데, 채점을 해보니 0.04ms~2.85ms 사이로 속도에 큰 문제가 되지는 않는 듯하다.
또한 map 메소드의 문제점은 if문에서 true 판정을 받았을 경우에만 결과물을 리턴하는 동작은 하지 못하는데, 이렇게 특정 조건에만 부합하는 배열을 만들기 위해선 따로 filter 메소드를 사용해야 한다.
하지만 중복 for 문은 if조건만 적어주어도 else일때의 리턴결과를 따로 빼 주지 않아도 된다는 장점이 있다.(내가 보기엔 그것만 장점이다.) 다만 for문에서는 삼항연산자 방식을 사용하기 어렵다. 당장 내가 쓴 if/else문을 삼항연산자로 바꿔도 런타임 에러가 난다.
function solution(arr) {
return arr.every((r, i) => r.every((_, j) => arr[i][j] === arr[j][i])) ? 1 : 0;
}
every() 메소드를 이용하여 간단하게 풀어버린 코드가 있었다. filter 사용법처럼 특정한 함수를 파라미터로 받아 조건으로 내거는 방식이다.