
25.03.13
프로그래머스 '특별한 이차원 배열 2'를 하다가 헷갈려서 정리하는 some 과 every
Q)
let arr = [[5,192,33],[192,72,95],[33,95,999]]
// arr 의 전체가 arr[i][j] = arr[j][i] 맞으면 1 하나라도 아니면 0
A)
// 오답
return +arr.some((items, xIdx)=>{
return items.some((item, yIdx)=> {
if(yIdx !== xIdx) return arr[yIdx][xIdx] === item
return true
});
})
해당 문제에서 물어보는 것은 이차원 배열의 대칭이 맞냐 아니냐인데, i===j 인 경우는 값이 다를 수 없어서 true 로 return했다.
여기에서 every를 쓰느냐 some 을 쓰느냐가 갈릴 수 있다.
둘 다 배열의 각 요소를 검사하는 메서드지만 동작방식에 차이가 있다.
some 은 적어도 하나의 요소가 주어진 조건을 만족하면 true를 반환한다. > 만족하는 요소를 찾으면 종료하고 true
every 는 모든 요소가 주어진 조건을 만족하면 true를 반환한다. > 만족하지 않는 요소를 찾으면 종료하고 false
처음 풀었던 문제가 오답인 이유가 some 은 만족하는 요소를 찾으면 true 여서 '==='이면 처음부터 true 니까 바로 종료했기 때문에 '!==' 로 찾았으면 정답이 되었을 것 같다.
A)
// every 로 바꾼 버전
return +arr.every((items, xIdx)=>{
return items.every((item, yIdx)=> {
if(yIdx !== xIdx) return arr[yIdx][xIdx] === item
return true
});
})
// some 을 사용한 버전
return +!arr.some((items, xIdx)=>{
return items.some((item, yIdx)=> {
if(yIdx !== xIdx) return arr[yIdx][xIdx] !== item
return false
});
})