22.11.24 TIL _?? 연산자_이중배열 Undefined

YES31·2022년 11월 25일
0

TIL

목록 보기
5/35
post-thumbnail

<힐링으로 다녀온 스카이워크.. 공돌이님들도 좋아할거 같아서 !>


이중배열의 Undefined

알고리즘 문제를 풀다보니 정말 작은부분 하나하나에 대해 배우는것 같다. 오늘 배운 부분은 이중배열 호출시 나타나는 undefined. 흔히 배열을 사용할때 배열 내부에 정의된 범위 안에서 해결하기 마련이지만.. 오늘 접한 문제에서는 이중배열 구조에서 상,하,좌,우 의 값을 비교해야 하는 과정때문에 undefined를 해결해야 했다.


arr1[ [1,10,7,4,6],[5,2,7,8,10],[10,5,6,2,3],[7,8,3,9,5],[1,1,5,12,9] ] 라는 이중배열의 각 요소마다 주변의 값보다 크다면 * 로 치환하는 문제였다.

arr1을 보기좋게 나열하면 아래와 같이 표현될 것이다.

 	[1,10,7,4,6]
    [5,2,7,8,10]
    [10,5,6,2,3]
    [7,8,3,9,5]
    [1,1,5,12,9]

주변값을 비교하는데 있어서 안쪽에 있는 요소들은 크게 문제가 없지만, 외각 쪽에 있는 값들은 1~2개의 주변 요소의 값이 없다. 여기서 이중배열의 undefined를 만날 수 있는데..

arr1[3][1]을 예를 들자면, 8은 > ( 상: 5 , 하: 1 , 좌: 7 , 우: 3 ) 보다 크다 는것을 쉽게 비교할 수 있어서 8을 *로 치환해주면 된다.

//좌측 값과 비교하기.
if(arr1[0][0] > arr1[0-1][0]){ // 좌측 값이 없기 때문에 undefined 발생.
 		arr1[0][0] = "*" 
  
}

하지만 arr1[0][0]과 같은경우는 상: ? , 좌: ? 의 값이 없기 때문에 비교하려고 한다면 arr1[0-1][0]의 값을 불러올때 arr1[0-1]의 과정에서 undefined가 발생하게 된다.

때문에, if(조건문) --> if(undefined) --> false가 되어 주변 값보다 크더라도 해당 값이 *로 치환되지 않는다.


그렇다면 어떻게 해야할까?

처음에는 구간별로 나눠서 풀이를 진행했다. 주변값이 4개가 있는 요소, 3개만 있는 요소, 2개만 있는 요소 구간별로 나눠서 풀었지만 매우 비효율적인 코드를 작성하게 되었다. 그래서 팀원들과 함께 효율적인 방법은 없었을지에 대하여 코드리뷰를 진행하면서 ?? 연산자에 대해 알 수 있었다.

nullish 병합 연산자 '??'

a ?? b  // a가 null도 아니고 undefined도 아니면 a 그 외의 경우는 b	

위에 코드에 적용하여 풀어보자면

if(arr1[0][0] > (arr1[0-1][0] ?? 0) )
                 ~~~~~~~~~~~~~~~~~~
   
   				//arr1[0-1][0]의 값이 Null 또는 undefined 라면 0 으로 치환하여 계산해줘!

라는 풀이가 가능하다. 때문에 주변값의 존재 유무와 상관없이 상,하,좌,우 를 비교하여 문제를 풀어나갈 수 있다.


[A][B]를 기준으로 상,하,좌,우 위치에 대한 index

풀이

if(arr1[A][B] > (arr1[A-1][B] ?? 0) && // 상 보다 크면서,
   arr1[A][B] > (arr1[A+1][B] ?? 0) && // 하 보다 크면서,
   arr1[A][B] > (arr1[A][B-1] ?? 0) && // 좌 보다 크면서,
   arr1[A][B] > (arr1[A][B+1] ?? 0) ) { // 우 보다 크다!
 
 		   arr[A][B] = "*" 
}
profile
🏀 주니어 개발자

0개의 댓글